2017-11-30 3 views
0

UserControlには共有されたViewModelが含まれています。複数のUserControlでのWPF TwoWayバインディング

Overview here

これは、ユーザーが(実際の構造はより複雑である)行の詳細を見るために行をクリックDataGridです。

問題は、私は、グリッドにSelectionChangedを扱うとき、私はContactDetailを更新するために共有ViewModelを更新したが、それは(オブジェクトがContactDetailに更新されますが、値は表示されません)TextBoxesで値を更新しないです。

ListContact.xaml.cs

public void contactsTable_OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    contacts.current_identity = //Get the associated `IdentityViewModel` 
} 

ContactDetail.xaml.cs

public partial class ContactDetail : UserControl 
{ 
    public ContactsViewModel contacts; 
    public DetailContact(ContactsViewModel contacts) 
    { 
     InitializeComponent(); 
     this.contacts = contacts; 
     this.DataContext = contacts; 
    } 
} 

<UserControl x:Class="ContactDetail"> 
    <TextBox Name='address' Text="{Binding Path=contacts.current_identity.address, Mode=TwoWay}"/> 
    <TextBox Name='phone' Text="{Binding Path=contacts.current_identity.phone, Mode=TwoWay}"/> 
    <TextBox Name='email' Text="{Binding Path=contacts.current_identity.email, Mode=TwoWay}"/> 
</UserControl> 

ContactDetail.xaml ContactsViewModel.cs(IdentityViewModelは同じ構造を使用しています)

public class ContactsViewModel : INotifyPropertyChanged 
{ 
    private List<Contact> _contacts; 
    public List<Contact> contacts; 
    { 
     get { return _contacts; } 
     set { _contacts = value; OnPropertyChanged("contacts"); } 
    } 

    private IdentityViewModel _current_identity; 
    public IdentityViewModel current_identity 
    { 
     get { return _current_identity; } 
     set { _current_identity = value; OnPropertyChanged("current_identity"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

は疑問は、なぜ動作しないのは、どのように新しい値が表示されるようにContactDetailに通知するのですか?

+1

参照( "ポインタ")自体を変更しない限り、参照型のインスタンスを 'ref'で渡す必要はありません。 'class'インスタンスは常に参照渡しされ、' struct'がコピーされます。 – dymanoid

+0

あなたのビューモデルは、必要なときに 'PropertyChanged'イベントを起こしていますか?あなたのビューモデルを投稿してください。 – dymanoid

+0

@dymanoid編集されています。 – BadMiscuit

答えて

2

連絡先のデータは変更されますが、元の参照場所Binding Path=contacts.current_identity.addressは引き続きバインディングで参照されています。 I. addressはまだ有効で変更されていません。変更されたのはcontacts.currentでしたが、あなたはそれにバインドされていません。

バインディングは、ロケーション参照への単純な反映です。元のaddressが変更された場合は、その変更が検索されているため変更が表示されます。しかし、代わりに親インスタンスが変更されたものです。

current_identityが変更されたときに適切な更新ができるようにバインディングをリファクタリングする必要があります。

+0

ありがとうございます。 「あなたのバインディングをリファクタリングして、current_identityが変更されたときに適切な更新ができるようにする必要がありますか? 'current_identity'を変更するたびに' DataContext'を更新する必要があるということですか? – BadMiscuit

+0

私は実際には、 'OnPropertyChanged'イベントをキャッチして、それぞれの' UserControl'で自分のデータを再バインドします。なんとなく、 'DataSource'を再定義する' DataGrid'では動作しますが、 'DataContext'を再定義するときには' TextBox'で再動作しません – BadMiscuit

関連する問題