2016-06-06 3 views
0

Я новичок в 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 

ответ

0

Здесь вы заселить ваш выпадающий с экземплярами анонимного типа:

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 сделает все, что отражается на вас, получите значение этого свойства named из выбранного элемента и залейте его в свойстве SelectedValue.В этом случае это должно быть SelectedItem.ID.

Guid selectedID = (Guid)OrganisationType_ComboBox.SelectedValue; 

Я предполагаю, что здесь что EntOrgs.ID имеет тип Guid. Если это не так, замените какой бы то ни было тип.

int selectedID = (int)OrganisationType_ComboBox.SelectedValue; 

Или что-то еще.

+0

Да, ID - это идентификатор GUID. OrganisationType_ComboBox.SelectedValue возвращает текстовое описание (OrganisationType) первого элемента в ComboBox, а не выбранный элемент или идентификатор для выбранного элемента. –

+0

Попробуйте удалить 'SelectedValue = {{Binding OrganisationType}" из XAML, я этого не заметил. –

+0

Да, это фантастически! Пример, который я использовал, имеет SelectedValue = "{Binding *****}". Теперь я снова смотрю на это, просто говорю, что независимо от того, что выбрано, верните весь список ссылок, когда его спросят, что такое SelectedValue? Если так, я не понимаю, почему это когда-нибудь будет использовано? –

Смежные вопросы