C# 多用户控件中的WPF双向绑定

C# 多用户控件中的WPF双向绑定,c#,wpf,user-controls,inotifypropertychanged,C#,Wpf,User Controls,Inotifypropertychanged,我有多个UserControl,其中包含一个共享的ViewModel 这是一个DataGrid,用户在其中单击一行以查看该行的详细信息(实际结构更复杂) 问题是当我在网格中处理选择更改时,我更新共享的视图模型以更新ContactDetail,但它不更新文本框中的值(对象在ContactDetail中更新,但不显示值) ListContact.xaml.cs public void contactsTable_OnSelectionChanged(object sender, Selection

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

这是一个
DataGrid
,用户在其中单击一行以查看该行的详细信息(实际结构更复杂)

问题是当我在网格中处理
选择更改
时,我更新共享的
视图模型
以更新ContactDetail,但它不更新
文本框中的值(对象在ContactDetail中更新,但不显示值)

ListContact.xaml.cs

public void contactsTable_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    contacts.current_identity = //Get the associated `IdentityViewModel`
}
public partial class ContactDetail : UserControl
{
    public ContactsViewModel contacts;
    public DetailContact(ContactsViewModel contacts)
    {
        InitializeComponent();
        this.contacts = contacts;
        this.DataContext = contacts;
    }
}
ContactDetail.xaml.cs

public void contactsTable_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    contacts.current_identity = //Get the associated `IdentityViewModel`
}
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使用相同的结构)

公共类联系人查看模型:INotifyPropertyChanged
{
私人名单(联络人);;
公开名单联系人;
{
获取{return\u contacts;}
设置{u contacts=value;OnPropertyChanged(“contacts”);}
}
私人身份查看模型当前身份;
公共标识视图模型当前_标识
{
获取{return\u current\u identity;}
设置{u当前标识=值;OnPropertyChanged(“当前标识”);}
}
公共事件属性更改事件处理程序属性更改;
公共void OnPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}

问题是,为什么这不起作用,以及如何通知ContactDetail以显示新值?

您的联系人数据会更改,但原始参考位置
绑定路径=联系人。当前的身份。地址仍在绑定中引用。即,
地址
仍然有效且未更改。更改的是联系人。当前的
,但您没有绑定到该联系人

请记住,绑定只是对位置引用的反射。如果原始的
地址发生更改,您将看到更改,因为这正是需要更改的内容。但相反,父实例发生了变化


您需要重构绑定,以便在
当前\u标识发生更改时进行适当更新

只要不更改引用(“指针”)本身,就不需要通过
ref
传递引用类型的实例。
实例将始终通过引用传递,而
结构
将被复制。您确定视图模型会在需要时引发
属性更改
事件吗?请发布您的视图模型。@dymanoid已编辑,是的。谢谢您的回答。您在“您需要重构绑定以允许在当前标识更改时进行适当更新”中的意思是,每次更改
当前标识时,我都需要更新
数据上下文,捕获
OnPropertyChanged
事件,然后在每个
UserControl
中重新绑定我的数据。在重新定义
DataContext