假设我有一个订单行对象集合...
public class OrderLine {
public decimal Qty { get; set; }
public decimal Cost { get; set; }
public decimal CostExt {
get {
return Qty * Cost;
}
}
}
当这些值被修改时,我可以在Qty
和Cost
中实现INotifyPropertyChanged
,并且我的 View 将收到更新通知。但是,CostExt
是一个聚合值,它依赖于 Qty
和 Cost
,这意味着我被迫在它相关的每个属性中也调用 PropertyChanged
!在一个可能有数百个属性和遍布各处的各种聚合的大型 View 模型中,这将成为维护的噩梦。有没有办法强制 View 重新审视聚合而不造成任何过度的痛苦?
编辑:好的,为了清楚起见,我正在寻找的设计模式将允许我简单地告诉聚合(CostExt
,在本例中)什么它应该将属性视为其绑定(bind)的组成部分。 Qty
、Cost
以及涉及的任何其他属性应该不需要知道聚合正在读取它们的事实。最终结果将是一个更加清晰的 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/