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