gpt4 book ai didi

c# - WPF MVVM 绑定(bind)嵌套属性

转载 作者:行者123 更新时间:2023-12-03 10:19:24 25 4
gpt4 key购买 nike

我正在创建一个应用程序,用户可以在其中编辑 child 的主数据,并且我试图通过保存他们为 child 所做的更改来为用户创建无缝体验。

我有一个名为 Child 的模型。

class Child
{
[Key]
public int ID { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
}

我有一个 View (ChildMasterDataView),它在可编辑的文本框中显示名字和姓氏。
<!--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 是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com