gpt4 book ai didi

c# - INotifyPropertyChanged 和计算属性

转载 作者:太空狗 更新时间:2023-10-29 20:00:44 26 4
gpt4 key购买 nike

假设我有一个简单的类 Order,它有一个 TotalPrice 计算属性,可以绑定(bind)到 WPF UI

public class Order : INotifyPropertyChanged
{
public decimal ItemPrice
{
get { return this.itemPrice; }
set
{
this.itemPrice = value;
this.RaisePropertyChanged("ItemPrice");
this.RaisePropertyChanged("TotalPrice");
}
}

public int Quantity
{
get { return this.quantity; }
set
{
this.quantity= value;
this.RaisePropertyChanged("Quantity");
this.RaisePropertyChanged("TotalPrice");
}
}

public decimal TotalPrice
{
get { return this.ItemPrice * this.Quantity; }
}
}

在影响 TotalPrice 计算的属性中调用 RaisePropertyChanged("TotalPrice") 是一种好的做法吗?刷新 TotalPrice 属性的最佳方法是什么?另一个版本当然是像这样改变属性

public decimal TotalPrice
{
get { return this.ItemPrice * this.Quantity; }
protected set
{
if(value >= 0)
throw ArgumentException("set method can be used for refresh purpose only");

}
}

并调用 TotalPrice = -1 而不是 this.RaisePropertyChanged("TotalPrice");在其他属性中。请提出更好的解决方案

非常感谢

最佳答案

另一个解决方案是 Robert Rossney 在这个问题中提出的解决方案:

WPF INotifyPropertyChanged for linked read-only properties

您可以创建属性依赖关系图(使用他的代码示例):

private static Dictionary<string, string[]> _DependencyMap = 
new Dictionary<string, string[]>
{
{"Foo", new[] { "Bar", "Baz" } },
};

然后在您的 OnPropertyChanged 中执行此操作:

PropertyChanged(this, new PropertyChangedEventArgs(propertyName))
if (_DependencyMap.ContainsKey(propertyName))
{
foreach (string p in _DependencyMap[propertyName])
{
PropertyChanged(this, new PropertyChangedEventArgs(p))
}
}

您甚至可以附加一个属性,将依赖属性与其所依赖的属性联系起来。像这样的东西:

[PropertyChangeDependsOn("Foo")]
public int Bar { get { return Foo * Foo; } }
[PropertyChangeDependsOn("Foo")]
public int Baz { get { return Foo * 2; } }

我还没有实现属性的细节。我最好现在就着手处理。

关于c# - INotifyPropertyChanged 和计算属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2235890/

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