2017-07-11 21 views
0

私のXAMLには、親要素を選択するComboBoxがあります。 ComboBoxでアイテムを選択すると、ComboBoxから選択された親に属する子エレメントがDataGridに挿入されます(これは意味があると思います)。ComboBoxを使用してDataGridのデータを選択する

私はこれを行うには、データバインディングと私のViewModelを使用したいと考えていましたが、私は正直なところ、私は次のように設定した私のViewModelに選択された連絡先グループIDを渡すためにどのよう見当がつかない
<!-- 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> 

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); 
    } 
} 

ComboBoxでListContactsForGroupCommandを実行するにはどうすればよいですか?

私はそれをSelectionChangedイベントにフックできると考えましたが、今はパラメータ値を提供する方法を見ています。

コードビハインドからこれを行うことはできますか?

+0

ContactGroupsViewModelのコードは役に立ちます –

+0

コンボボックスで別のアイテムが選択されたときに 'ContactGroup'セッターが呼び出されます。コマンドやイベントは必要ありません。唯一の注意点は、コードの背後からsetterを呼び出さないことです(初期値の設定時など)。これは別のプロパティを持つことができます(または、プロパティのバインドを更新するためのフィールドと上昇通知を設定するだけです)。 – Sinatr

+0

@RomanoZumbéどのようにすれば正確に役立ちますか?難しいことではありませんが、私が提供したコードから、私が使用しようとしているIdとNameプロパティが含まれていることは明らかです。私はそのコードをどうやって私が試みていることを達成するのを助けるのか理解できません。あなたは説明できますか? – Ortund

答えて

1

私はこのようにそれを実装します:

ビューモデル

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

おはようございます、ContactGroupsは変更するつもりはないので、セッターはそこにいる必要はありませんが、私はまだComboBoxを変更する方法について混乱しています。特定のContactGroupに所属する連絡先のみが含まれていることを確認してください – Ortund

+0

私のコードは正確にそれを行うべきです –

+0

私の脳は今日1/3の能力のように走っているようです。 ContactGroupのセッターでPropertyChangedイベントを発生させているからでしょうか? – Ortund

1

ビューモデルにContactGroupプロパティを追加して、コマンドを実行します、またはListContactGroups()メソッドを直接呼び出すと、私はnはこの1のセッター:

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

あなたのXAMLでContactGroupComboBoxSelectedValueプロパティを結合しているので、これは動作するはずです:

SelectedValue="{Binding ContactGroup}" /> 

これは、このプロパティは、あなたたびに設定されることを意味しますComboBoxの項目を選択します。

+0

ListContactsForGroupCommandはICommandでメソッド/関数に変更する必要はなく、うまく動作するmm8のソリューションに従う必要はありません – stuicidle

関連する問題