gpt4 book ai didi

c# - 如何为聚合属性实现 INotifyPropertyChanged

转载 作者:行者123 更新时间:2023-11-30 23:27:55 26 4
gpt4 key购买 nike

假设我有一个订单行对象集合...

public class OrderLine {
public decimal Qty { get; set; }
public decimal Cost { get; set; }
public decimal CostExt {
get {
return Qty * Cost;
}
}
}

当这些值被修改时,我可以在 QtyCost 中实现 INotifyPropertyChanged,我的 View 将收到更新通知。然而,CostExt 是一个聚合值,它依赖于 Qty Cost,这意味着我被迫在与它相关的每个属性中也对其调用 PropertyChanged !在一个可能有数百个属性和各种聚合的大型 View 模型中,这将成为维护的噩梦。有没有办法在没有任何不当痛苦的情况下强制 View 重新检查聚合?

编辑:好吧,为了清楚起见,我正在寻找的设计模式将允许我简单地告诉聚合(CostExt,在这种情况下)什么它应该考虑对其绑定(bind)不可或缺的属性。 QtyCost 和任何其他涉及的属性都不需要知道它们正在被聚合读取的事实。最终结果将是一个更清晰的 View 模型,而不需要重写现有属性,因为新的聚合需要它们。很简单,嗯?

最佳答案

如果您不想手动实现 INotifyPropertyChanged,请使用 Fody PropertyChanged .

您的代码:

[ImplementPropertyChanged]
public class Person
{
public string GivenNames { get; set; }
public string FamilyName { get; set; }

public string FullName
{
get
{
return string.Format("{0} {1}", GivenNames, FamilyName);
}
}
}

编译时:

public class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

string givenNames;
public string GivenNames
{
get { return givenNames; }
set
{
if (value != givenNames)
{
givenNames = value;
OnPropertyChanged("GivenNames");
OnPropertyChanged("FullName");
}
}
}

string familyName;
public string FamilyName
{
get { return familyName; }
set
{
if (value != familyName)
{
familyName = value;
OnPropertyChanged("FamilyName");
OnPropertyChanged("FullName");
}
}
}

public string FullName
{
get
{
return string.Format("{0} {1}", GivenNames, FamilyName);
}
}

public virtual void OnPropertyChanged(string propertyName)
{
var propertyChanged = PropertyChanged;
if (propertyChanged != null)
{
propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

请注意,依赖于其他属性的属性将被选取。

关于c# - 如何为聚合属性实现 INotifyPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36244310/

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