【问题标题】:ComboBox SelectedValuePath SelectionChanged组合框 SelectedValuePath SelectionChanged
【发布时间】:2016-10-06 11:24:37
【问题描述】:

我是 WPF 和数据绑定概念的新手,我正在自学(通过这个应用程序和几本书)。

我试过搜索,但是有很多关于如何绑定它的问题(和答案),而不是如何引用/使用 SelectedValue 和 SelectedValuePath 中的选定项:

概述: 我在 window_loaded 上填充了一个 ComboBox,如下所示:

Private db As New Pluto_DBDataContext()
Private OrganisationTypeView As BindingListCollectionView

Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
    LoadOrganisationType()
End Sub

Private Sub LoadOrganisationType()
    Dim OrganisationTypeList = From EntOrgs In db.t_EntityOrgs
                               Join EntType In db.t_EntityTypes On EntType.ID Equals EntOrgs.FK_EntityType_ID
                               Order By EntOrgs.OrganisationType
                               Where EntOrgs.DateTime_To Is Nothing AndAlso EntType.DateTime_To Is Nothing _
                               AndAlso ((Not bolIndividualEntityType) And EntType.EntityType <> "Individual")
                               Select EntOrgs.OrganisationType, EntOrgs.ID

    OrganisationType_ComboBox.DataContext = OrganisationTypeList
    Me.OrganisationTypeView = CType(CollectionViewSource.GetDefaultView(OrganisationType_ComboBox.DataContext), BindingListCollectionView)
End Sub

XAML:

    <ComboBox x:Name="OrganisationType_ComboBox" Grid.Row="1" Grid.Column="0" ItemsSource="{Binding}" SelectedValue="{Binding OrganisationType}" SelectedValuePath="ID" DisplayMemberPath="OrganisationType"/>

ComboBox_SelectionChanged: 然后,我使用选定的 OrganisationType 来过滤客户端的 ListView,如下所示(注意还有其他控件也会触发 RefreshOrganisationClientList())。

这就是我的问题所在。如何获取所选值和/或该选择的 ID (SelectedValuePath)。

Private Sub OrganisationType_ComboBox_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles OrganisationType_ComboBox.SelectionChanged
    If OrganisationType_ComboBox.SelectedItem IsNot Nothing Then
        RefreshOrganisationClientList()
    End If
End Sub

Private Sub RefreshOrganisationClientList()
    Dim sOrgType As String
    Dim guOrgType_ID As Guid
    Dim sOrganisationName As String
    Dim sPostCode As String
    Dim sOccupation As String

    If OrganisationType_ComboBox.SelectedItem Is Nothing Then
        sOrgType = Nothing
    Else
        '*****PROBLEM HERE*****
        sOrgType = OrganisationType_ComboBox.SelectedItem.index(1).ToString
        guOrgType_ID = OrganisationType_ComboBox.SelectedItem

        'guOrgType_ID = Guid.Parse(OrganisationType_ComboBox.SelectedValuePath)

    End If
    MsgBox(sOrgType)
    MsgBox(guOrgType_ID)

    sOrganisationName = OrganisationName_TextBox.Text
    sPostCode = OrgPostalCode_TextBox.Text
    sOccupation = OrgOccupation_TextBox.Text

    Dim FilteredClientList = From Clients In db.t_Clients
                             Join EntType In db.t_EntityTypes On EntType.ID Equals Clients.FK_EntityType_ID
                             Join EntOrgs In db.t_EntityOrgs On EntType.ID Equals EntOrgs.FK_EntityType_ID
                             Order By Clients.OrganisationName, Clients.Occupation, EntOrgs.OrganisationType
                             Where Clients.DateTime_To Is Nothing AndAlso EntType.DateTime_To Is Nothing AndAlso EntOrgs.DateTime_To Is Nothing _
                             AndAlso ((Not bolIndividualEntityType) And EntType.EntityType <> "Individual") _
                             AndAlso (If(sOrgType IsNot Nothing, EntOrgs.ID = guOrgType_ID, True)) _
                             AndAlso (If(sOrganisationName IsNot "", Clients.OrganisationName Like "*" & sOrganisationName & "*", True)) _
                             AndAlso (If(sPostCode IsNot "", Clients.Postal_Code Like "*" & sPostCode & "*", True)) _
                             AndAlso (If(sOccupation IsNot "", Clients.Occupation Like "*" & sOccupation & "*", True))
                             Select Clients.OrganisationName, EntOrgs.OrganisationType, Clients.Occupation, Clients.FormationDate, Clients.Postal_Code, Clients.ID

    ExistingOrganisationClients_ListView.DataContext = FilteredClientList
    Me.FilteredOrgansiationClientView = CType(CollectionViewSource.GetDefaultView(ExistingOrganisationClients_ListView.DataContext), BindingListCollectionView)
End Sub

我开始认为我误解了数据绑定本身的概念以及如何使用从数据绑定控件中选择的数据,或者我忽略了一些简单的事情。

编辑:我试图发布一张图片,但由于我是新来的,所以我无法这样做,所以必须提供描述和 imgur 链接: 在以下两个中,“合作伙伴”都是从组合框中选择的,而不是“慈善”。 Charity 是呈现给用户的列表中的第一项。

SelectedValue 的内容: SelectedValue Imgur Link

-    OrganisationType_ComboBox.SelectedValue    "Charity"   Object {String}

SelectedItem 的内容: SelectedItem Imgur Link

-    OrganisationType_ComboBox.SelectedItem OrganisationType="Partnerships", ID={27775e86-0013-4b82-996f-f6c061e99b2f}  Object {VB$AnonymousType_3(Of String, System.Guid)}
    +    ID {27775e86-0013-4b82-996f-f6c061e99b2f}  System.Guid
    -    OrganisationType   "Partnerships"  String

编辑:对于以后偶然发现此问题的任何人;以下是修复上述问题的更新。再次感谢!:

XAML:

    <ComboBox x:Name="OrganisationType_ComboBox" Grid.Row="1" Grid.Column="0" ItemsSource="{Binding}" SelectedValuePath="ID" DisplayMemberPath="OrganisationType"/>

ComboBox_SelectionChanged:

Private Sub RefreshOrganisationClientList()
    Dim sOrgType As String
    Dim guOrgType_ID As Guid
    Dim sOrganisationName As String
    Dim sPostCode As String
    Dim sOccupation As String

    If OrganisationType_ComboBox.SelectedItem Is Nothing Then
        guOrgType_ID = Nothing
    Else
        guOrgType_ID = OrganisationType_ComboBox.SelectedValue
    End If

    sOrganisationName = OrganisationName_TextBox.Text
    sPostCode = OrgPostalCode_TextBox.Text
    sOccupation = OrgOccupation_TextBox.Text

    Dim FilteredClientList = From Clients In db.t_Clients
                             Join EntType In db.t_EntityTypes On EntType.ID Equals Clients.FK_EntityType_ID
                             Join EntOrgs In db.t_EntityOrgs On EntType.ID Equals EntOrgs.FK_EntityType_ID
                             Order By Clients.OrganisationName, Clients.Occupation, EntOrgs.OrganisationType
                             Where Clients.DateTime_To Is Nothing AndAlso EntType.DateTime_To Is Nothing AndAlso EntOrgs.DateTime_To Is Nothing _
                             AndAlso ((Not bolIndividualEntityType) And EntType.EntityType <> "Individual") _
                             AndAlso (If(guOrgType_ID <> Guid.Empty, EntOrgs.ID = guOrgType_ID, True)) _
                             AndAlso (If(sOrganisationName IsNot "", Clients.OrganisationName Like "*" & sOrganisationName & "*", True)) _
                             AndAlso (If(sPostCode IsNot "", Clients.Postal_Code Like "*" & sPostCode & "*", True)) _
                             AndAlso (If(sOccupation IsNot "", Clients.Occupation Like "*" & sOccupation & "*", True))
                             Select Clients.OrganisationName, EntOrgs.OrganisationType, Clients.Occupation, Clients.FormationDate, Clients.Postal_Code, Clients.ID

    ExistingOrganisationClients_ListView.DataContext = FilteredClientList
    Me.FilteredOrgansiationClientView = CType(CollectionViewSource.GetDefaultView(ExistingOrganisationClients_ListView.DataContext), BindingListCollectionView)
End Sub

【问题讨论】:

    标签: wpf vb.net data-binding combobox


    【解决方案1】:

    在这里,您使用 匿名类型的实例填充组合框:

    Dim OrganisationTypeList = From EntOrgs In db.t_EntityOrgs
                               Join EntType In db.t_EntityTypes On EntType.ID Equals EntOrgs.FK_EntityType_ID
                               Order By EntOrgs.OrganisationType
                               Where EntOrgs.DateTime_To Is Nothing AndAlso EntType.DateTime_To Is Nothing _
                               AndAlso ((Not bolIndividualEntityType) And EntType.EntityType <> "Individual")
                               Select EntOrgs.OrganisationType, EntOrgs.ID
    
    OrganisationType_ComboBox.DataContext = OrganisationTypeList
    

    当用户选择某些东西时,ComboBox.SelectedItem 将是该匿名类型的一个实例。您需要几行反射代码才能从中获取任何属性值,因为您无法将其转换为任何内容。

    幸运的是,您在组合框上设置了SelectedValuePath="ID"。如果SelectedValuePath 命名了一个实际存在于所选项目上的属性,ComboBox 将为您完成所有反射工作,从所选项目中获取该命名属性的值,并将其填充到SelectedValue 属性中。在这种情况下,应该是SelectedItem.ID

    Guid selectedID = (Guid)OrganisationType_ComboBox.SelectedValue;
    

    我在这里猜测EntOrgs.ID 的类型是Guid。如果不是,请替换它实际上是的任何类型。

    int selectedID = (int)OrganisationType_ComboBox.SelectedValue;
    

    或其他。

    【讨论】:

    • 是的,ID 是一个 GUID。 OrganisationType_ComboBox.SelectedValue 返回 ComboBox 中第一个项目的文本描述 (OrganisationType),而不是所选项目或该所选项目的 ID。
    • 尝试从 XAML 中删除 SelectedValue="{Binding OrganisationType}",我没有注意到。
    • 是的,太棒了!我使用的示例具有 SelectedValue="{Binding *****}"。现在我再看一遍,是否只是说无论选择了什么,当被问到 SelectedValue 是什么时,都返回整个绑定列表?如果是这样,我看不出为什么会使用它?
    • 您通常会将 SelectedValue 绑定到视图模型的属性(在本例中为 Guid 类型),并且视图模型通常是组合框的数据上下文。项目集合将是视图模型的某些属性。我想也许在“{Binding ****}”中,星号可能意味着“无论你的属性名称是什么”。不是我如何表达这个概念!
    • @G.Williams 那里有一些可怕的“信息”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多