WPF TwoWay绑定在多个UserControl中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF TwoWay绑定在多个UserControl中相关的知识,希望对你有一定的参考价值。

我有多个UserControl,其中包含共享的ViewModel

Overview here

这是一个DataGrid,用户点击一行来查看行的细节(实际结构更复杂)。

问题是当我处理网格中的SelectionChanged时,我更新共享的ViewModel以更新ContactDetail但它不更新TextBoxes中的值(该对象在ContactDetail中更新但不显示值)。

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

ContactDetail.xaml

 <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>

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以便它显示新值?

答案

您的联系人数据发生了变化,但原始参考位置Binding Path=contacts.current_identity.address仍然在绑定中被引用。 I.E. address仍然有效,并没有改变。改变的是contacts.current但你没有约束力。

请记住,绑定只是对位置引用的反映。如果原始的address发生了变化,你会看到一个变化,因为这是正在寻找变化的东西。但是,父实例改变了。

current_identity发生变化时,您需要重构绑定以允许正确更新。

以上是关于WPF TwoWay绑定在多个UserControl中的主要内容,如果未能解决你的问题,请参考以下文章

升级 .NET 版本后,TwoWay 或 OneWayToSource 绑定无法在只读属性上工作

wpf model 默认啥模式? twoWay?

wpf checkbox 如何绑定变量

如何使用 TwoWay 模式将 Listview SelectedItem 绑定到文本框?

WPF

WPF:定义绑定的默认值