[英]WPF MVVM Binding nested property
我正在创建一个用户可以编辑孩子的主数据的应用程序,我正在尝试通过保存他们为孩子所做的更改来为用户创建无缝体验。
我有一个名为Child的模型。
class Child
{
[Key]
public int ID { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
}
我有一个视图(ChildMasterDataView),它显示可编辑文本框中的FirstName和Surname。
<!--First name-->
<Label Content="First name:" />
<TextBox Text="{Binding Path=Child.FirstName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<!--Surname-->
<Label Content="Surname:" />
<TextBox Text="{Binding Path=Child.Surname, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
我有一个类来处理INotifyPropertyChanged接口的实现。
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChangedEvent(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
我有一个ViewModel,当相应的属性发生变化时,它应该保存对Firstname和Surname所做的更改。 问题是Firstname和Surname是Child类的嵌套属性,并且没有触发PropertyChanged事件......
class ChildMasterDataViewModel : ObservableObject
{
private Database db; // Database context
public ChildViewModel()
{
db = new Database();
Child = db.Children.ToList().Where(e => e.PlbNr == 1).FirstOrDefault(); // Won't be null because child has been chosen earlier
PropertyChanged += ChildPropertyChanged;
}
private Child child;
public Child Child
{
get { return child; }
set { child = value; RaisePropertyChangedEvent("Child"); }
}
private void ChildPropertyChanged(object sender, PropertyChangedEventArgs e)
{
db.SaveChanges();
}
}
通过对ViewModel进行以下更改(以及更改视图绑定),我可以完成我想要的任务:
class ChildMasterDataViewModel : ObservableObject
{
private Database db; // Database context
private Child child;
public ChildViewModel()
{
db = new Database();
child = db.Children.ToList().Where(e => e.PlbNr == 1).FirstOrDefault(); // Won't be null because child has been chosen earlier
PropertyChanged += ChildPropertyChanged;
}
public string FirstName
{
get { return child.FirstName; }
set { child.FirstName= value; RaisePropertyChangedEvent("FirstName"); }
}
public string Surname
{
get { return child.Surname; }
set { child.Surname= value; RaisePropertyChangedEvent("Surname"); }
}
private void ChildPropertyChanged(object sender, PropertyChangedEventArgs e)
{
db.SaveChanges();
}
}
这不可能是正确的,必须有更好的方法吗?
我尝试在Child类中实现ObservableObject,然后在ViewModel中将Child类的PropertyChanged事件订阅到ViewModel的ChildPropertyChanged方法。 这没用。
就个人而言,我认为没有理由不在你的Child模型中放置一个简单的INotifyPropertyChanged
实现 - 毕竟它具有正在改变的属性。 现在你可以直接绑定它们了。
出于同样的原因,为什么保存ViewModel的状态部分? 我会将其移入模型或单独的持久性管理器中。 VM应该模拟View的独立于Model的方面。
当依赖属性开始使用绑定时,它尝试将绑定实例转换为INotifyPropertyChanged,然后使用“弱事件”订阅事件。 所以dependecy属性对内部属性等一无所知,它只是尝试转换为INotifyPropertyChanged并对事件进行处理。 接下来,当事件将会上升时,依赖性peroperty,使用反射,将获得新的值(它是改进它的方式,你可以编写自己的依赖属性,这将使用Expression,从属性获取值)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.