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

标签 c# wpf mvvm

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

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/

相关文章:

c# - EF 返回旧值

wpf - WPF 中的简单(我认为)水平线?

wpf - 禁用整个上下文菜单

c# - WPF - MVVM - 从 View 模型返回可绑定(bind)控件模板

c# - 尝试将 IWebElement 转换为 By 元素

silverlight - 在 Silverlight NumericUpDown 更改值之前触发 MVVM 中继命令

c# - Caliburn.Micro 的保护子句出错

C# 格式任意大的 BigInteger 用于无尽的游戏

c# - 最佳实践 : Adding a CLI to Existing Windows Service in . NET/Core

c# - 循环中的 Process.Start(url) 不会启动每个实例