我正在创建一个应用程序,用户可以在其中编辑 child 的主数据,并试图通过为他们保存对 child 所做的更改来为用户提供无缝的体验。
我有一个名为Child的模型。
class Child
{
[Key]
public int ID { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
}
我有一个 View (ChildMasterDataView),该 View 在可编辑的文本框中显示名字和姓氏。
<!--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接口(interface)的实现的类。
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进行以下更改(并更改 View 绑定(bind))来完成所需的操作:
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方法。这没有用。
最佳答案
我个人认为,没有理由不将简单的INotifyPropertyChanged
实现放入您的Child模型-毕竟它的属性正在发生变化。现在,您可以直接绑定(bind)到它们。
同样,为什么保存状态是ViewModel的一部分?我会将其移入模型或单独的持久性管理器。虚拟机应该对独立于模型的 View 方面进行建模。
关于c# - WPF MVVM绑定(bind)嵌套属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38956222/