c# - 调用 INotifyPropertyChanged 的​​ PropertyChanged 事件的最佳方式是什么?

标签 c# .net .net-3.5 inotifypropertychanged automatic-properties

<分区>

当您实现 INotifyPropertyChanged 接口(interface)时,您负责在类中每次更新属性时调用 PropertyChanged 事件。

这通常会导致以下代码:

    public class MyClass: INotifyPropertyChanged

        private bool myfield;
        public bool MyField
        {
            get { return myfield; }
            set
            {
                if (myfield == value)
                    return;
                myfield = value;
                OnPropertyChanged(new PropertyChangedEventArgs("MyField"));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler h = PropertyChanged;
            if (h != null)
                h(this, e);
        }
   }

即每个属性 12 行

如果能够像这样装饰自动属性,那就简单多了:

[INotifyProperty]
public double MyField{ get; set; }

但不幸的是,这是不可能的(例如,参见 msdn 上的 this post)

如何减少每个属性所需的代码量?

最佳答案

实际上,每个属性只有 3-4 行;其他行在所有“通知”属性上摊销:

class Person : INotifyPropertyChanged
{
    #region INotifyPropertyChanged: Shared bit
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, e);
    }
    #endregion

    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            if (_firstName == value)
                return;
            _firstName = value;
            OnPropertyChanged(new PropertyChangedEventArgs("FirstName"));
        }
    }

    // Ditto for other properties
}

您可以尝试类似以下的方法,它会分担更多的负载:

private string _firstName;
public string FirstName
{
    get { return _firstName; }
    set { SetNotifyingProperty("FirstName", ref _firstName, value); }
}
private void SetNotifyingProperty<T>(string propertyName,
                                     ref T field, T value)
{
    if (value.Equals(field))
        return;
    field = value;
    OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}

关于c# - 调用 INotifyPropertyChanged 的​​ PropertyChanged 事件的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/488587/

相关文章:

visual-studio-2010 - “.NET Framework 3.5 SP1 客户端配置文件”先决条件

c# - 使用带有 bool 值的 C# 维护 ASP.NET 3.5 中的 session 状态

C# LIifxNet 切换光功率,LIFX

c# - 如何从动态对象中获取反序列化的xml属性

c# - 使用 IP 地址打印到网络打印机

.net - 对于 Windows 窗体,PostMessage 与 self 的等价物是什么?

c# - 您可以将 asp.net gridview 数据绑定(bind)到基类中的字段吗?

c# - 检查 JSON 和 XML 是否有效? C#

c# - 在 .net 中,哪种编程模型适合原型(prototype)制作,但随后可重复用于生产(用于业务逻辑/数据访问层)

.net - 移动设备上的 OutOfMemoryException