2017-07-11 3 views
0

In meinem XAML habe ich eine ComboBox, die ein Elternelement auswählt. Die Auswahl eines Eintrags in der ComboBox sollte ein DataGrid mit untergeordneten Elementen füllen, die zu dem ausgewählten Elternteil von der ComboBox gehören (ich hoffe, das macht Sinn).Verwenden einer ComboBox zum Auswählen von Daten für ein DataGrid

<!-- Select here to populate datagrid --> 
<ComboBox ItemsSource="{Binding ContactGroups}" 
      DisplayMemberPath="Name" 
      SelectedValuePath="Id" 
      SelectedValue="{Binding ContactGroup}" /> 

<!-- ComboBox selection loads data to the grid --> 
<DataGrid ItemsSource={Binding Contacts}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding FirstName}" Header="First Name" /> 
     <DataGridTextColumn Binding="{Binding LastName}" Header="Last Name" /> 
    </DataGrid.Columns> 
</DataGrid> 

Ich wollte nur Datenbindung nutzen und mein Viewmodel, dies zu tun, aber ich habe ehrlich gesagt keine Ahnung, wie die ausgewählte Kontaktgruppe Id mein Viewmodel passieren, die ich habe mit dem folgenden ein:

public class ContactsViewModel 
{ 
    private readonly ObservableCollection<Contact> _Contacts 
     = new ObservableCollection<Contact>(); 
    public IEnumerable<Contact> Contacts 
    { 
     get { return _Contacts; } 
    } 

    private ObservableCollection<ContactGroup> _ContactGroups 
     = new ObservableCollection<ContactGroup>(); 
    private IEnumerable<ContactGroup> ContactGroups 
    { 
     get { return _ContactGroupsViewModel; } 
    } 

    // Binding for ContactGroups ComboBox 
    public ICommand ListContactGroupsCommand 
    { 
     get 
     { 
      return new MyDelegateCommand(ListContactGroups); 
     } 
    } 
    private void ListContactGroups() 
    { 
     using (ApplicationDbContext Context = new ApplicationDbContext()) 
     { 
      var ContactGroups = Context.ContactGroups.Where 
      (
       x => x.Deleted == false 
      ); 

      foreach (var c in ContactGroups) 
      { 
       AddToContactGroups(c); 
      } 
     } 
    } 
    private void AddToContactGroups(ContactGroup group) 
    { 
     if (!_ContactGroups.Contains(group)) 
      _ContactGroups.Add(group); 
    } 

    // Handle selection of a ContactGroup. 
    public ICommand ListContactsForGroupCommand 
    { 
     get 
     { 
      return new MyDelegateCommand((ContactGroupId) => 
       { ListContacts((int)ContactGroupId); }); 
     } 
    } 

    private void ListContacts(int contactGroupId) 
    { 
     using (ApplicationDbContext db = new ApplicationDbContext()) 
     { 
      var Contacts = db.Contacts.Where 
      (
       x => x.ContactGroupId == contactGroupId && 
       x.Deleted == false 
      ); 
      foreach (var c in Contacts) 
      { 
       AddToContacts(c); 
      } 
     } 
    } 
    private void AddToContacts(Contact contact) 
    { 
     if (!_Contacts.Contains(contact)) 
      _Contacts.Add(contact); 
    } 
} 

Wie kann ich meine ListContactsForGroupCommand auf der ComboBox ausführen?

Ich dachte, ich kann es in das SelectionChanged Ereignis haken, aber ich sehe jetzt Weg, um einen Parameterwert zur Verfügung zu stellen.

Kann ich dies aus dem Code-Behind tun?

+0

Der Code von ContactGroupsViewModel würde helfen –

+0

'ContactGroup' Setter wird aufgerufen, wenn ein anderes Element in der Combobox ausgewählt ist. Sie brauchen weder Befehl noch Ereignis. Die einzige Vorsichtsmaßnahme besteht darin, den Setter nicht aus dem Code heraus aufzurufen (z. B. beim Setzen des Anfangswerts), dafür können Sie eine andere Eigenschaft haben (oder einfach die Feld- und Anstiegsbenachrichtigung für die Eigenschaft zum Aktualisieren von Bindungen setzen). – Sinatr

+0

@ RomanoZumbé in welcher Weise würde es genau helfen? Ich möchte nicht schwierig sein, aber von dem Code, den ich zur Verfügung gestellt habe, ist es offensichtlich, dass er eine Id- und Name-Eigenschaft enthält, die ich zu verwenden versuche. Ich verstehe nicht, wie dir der Code hilft, mir zu helfen, das zu erreichen, was ich versuche. Könntest du erklären? – Ortund

Antwort

1

Ich würde es so implementieren:

Ansicht Modell:

public class ContactsViewModel 
{  
    public IEnumerable<Contact> Contacts 
    { 
     get 
     { 
      return db.Contacts.Where 
      (
       x => x.ContactGroupId == ContactGroup.Id && 
       x.Deleted == false 
      ); 
     } 
    } 

    private ContactGroup _contactGroup = new ContactGroup(); 
    private ContactGroup ContactGroup 
    { 
     get { return _contactGroup; } 
     set 
     { 
      _contactGroup = value; 
      RaisePropertyChangedEvent("ContactGroup"); 
      RaisePropertyChangedEvent("Contacts"); 
     } 
    } 

    private ObservableCollection<ContactGroup> _ContactGroups 
    = new ObservableCollection<ContactGroup>(); 
    private IEnumerable<ContactGroup> ContactGroups 
    { 
     get { return _ContactGroupsViewModel; } 
    } 
} 

XAML:

<!-- Select here to populate datagrid --> 
<ComboBox ItemsSource="{Binding ContactGroups}" 
      DisplayMemberPath="Name" 
      SelectedItem="{Binding ContactGroup}" /> 

<!-- ComboBox selection loads data to the grid --> 
<DataGrid ItemsSource={Binding Contacts}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding FirstName}" Header="First Name" /> 
     <DataGridTextColumn Binding="{Binding LastName}" Header="Last Name" /> 
    </DataGrid.Columns> 
</DataGrid> 
+0

Gute Nachrichten ist die ContactGroups sind nicht dazu bestimmt, zu ändern, so dass die Setter nicht da sein muss, aber ich bin immer noch verwirrt darüber, wie die ComboBox ändern 'Kontakte' so dass es nur die Kontakte enthält, die zu einer bestimmten ContactGroup gehören – Ortund

+0

Mein Code sollte genau das tun –

+0

Ich bin mir nicht ganz klar, wie ... Mein Gehirn scheint heute nur noch wie eine 1/3 Kapazität zu laufen. Liegt das daran, dass wir das PropertyChanged-Ereignis auf dem Setter für ContactGroup auslösen? – Ortund

1

eine ContactGroup Eigenschaft zu Ihrer Ansicht Modell hinzufügen und den Befehl oder rufen Sie direkt die ListContactGroups() Methode an, d n die Setter von dieser:

private int _contactGroup; 
public int ContactGroup 
{ 
    get { return _contactGroup; } 
    set 
    { 
     _contactGroup = value; 
     ListContactGroups(); 
    } 
} 

Dies sollte funktionieren, da Sie die SelectedValue Eigenschaft des ComboBox zu ContactGroup in XAML binden:

SelectedValue="{Binding ContactGroup}" /> 

Das bedeutet, dass diese Eigenschaft, wenn Sie festgelegt werden Wählen Sie einen Artikel in der ComboBox.

+0

ListContactsForGroupCommand muss kein ICommand sein, ändern Sie es in eine Methode/Funktion und folgen Sie der mm8-Lösung, es sollte gut funktionieren – stuicidle

Verwandte Themen