首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ComboBox SelectedValuePath SelectionChanged

ComboBox SelectedValuePath SelectionChanged
EN

Stack Overflow用户
提问于 2016-06-06 18:29:17
回答 1查看 386关注 0票数 0

我对WPF和数据库概念很陌生,我正在自学(用这个应用程序和几本书)。

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

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

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
    <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)。

代码语言:javascript
运行
复制
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

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

编辑:我试着发布一个图片,但由于我是新来的,我不能这样做,所以一个描述和一个链接将不得不这样做:在下面这两个方面,“合作伙伴关系”是从ComboBox而不是“慈善”中选择的。慈善是向用户展示的清单中的第一项。

SelectedValue:SelectedValue Imgur链接含量

代码语言:javascript
运行
复制
-    OrganisationType_ComboBox.SelectedValue    "Charity"   Object {String}

SelectedItem:SelectedItem Imgur链接含量

代码语言:javascript
运行
复制
-    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:

代码语言:javascript
运行
复制
    <ComboBox x:Name="OrganisationType_ComboBox" Grid.Row="1" Grid.Column="0" ItemsSource="{Binding}" SelectedValuePath="ID" DisplayMemberPath="OrganisationType"/>

ComboBox_SelectionChanged:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-06 18:40:26

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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
Guid selectedID = (Guid)OrganisationType_ComboBox.SelectedValue;

我猜EntOrgs.IDGuid型的。如果不是的话,不管它是什么类型,都用它代替。

代码语言:javascript
运行
复制
int selectedID = (int)OrganisationType_ComboBox.SelectedValue;

或者别的什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37664445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档