Я новичок в WPF и концепции привязки данных, и я сейчас участвую в обучении (с этим приложением и несколькими книгами).ComboBox SelectedValuePath SelectionChanged
Я пытался искать, но есть много вопросов (и ответов) о том, как связать его, но не как ссылаться/использовать выбранный элемент из SelectedValue и SelectedValuePath:
Обзор: I «м заполнение ComboBox на window_loaded, как показано ниже:
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()).
Здесь моя проблема. Как получить выбранное значение AND/ИЛИ 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
Я начинаю думать, что я непонимание самой концепции привязки данных и как использовать данные, выбранные из элементов управления, данные, связанные, или я упускать из виду что-то простое.
EDIT: Я попытался опубликовать изображение, но так как я новичок здесь, я не могу этого сделать, поэтому вам нужно будет описать описание и ссылку imgur: В обоих приведенных ниже «Партнерствах» было выбранный из ComboBox, а не «Благотворительность». Благотворительность - это первый элемент в списке, представленный пользователю.
Содержание 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
EDIT: Для всех, кто спотыкается через это позже; ниже приведена обновленная информация для устранения вышеуказанной проблемы. Еще раз спасибо !:
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
Да, ID - это идентификатор GUID. OrganisationType_ComboBox.SelectedValue возвращает текстовое описание (OrganisationType) первого элемента в ComboBox, а не выбранный элемент или идентификатор для выбранного элемента. –
Попробуйте удалить 'SelectedValue = {{Binding OrganisationType}" из XAML, я этого не заметил. –
Да, это фантастически! Пример, который я использовал, имеет SelectedValue = "{Binding *****}". Теперь я снова смотрю на это, просто говорю, что независимо от того, что выбрано, верните весь список ссылок, когда его спросят, что такое SelectedValue? Если так, я не понимаю, почему это когда-нибудь будет использовано? –