10

当您实现 INotifyPropertyChanged 接口时,您负责在每次更新类中的属性时调用 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 上的这篇文章)

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

4

3 回答 3

7

实际上,每个属性只有 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));
}
于 2009-02-16T19:11:08.247 回答
2

我现在要做的是在课堂上写这个:

 //AUTOGENERATE INotifyProperty
 private bool myfield;

我写了一个小工具,它在部分类中生成所有需要的属性代码。这绝不是一个优雅的解决方案,但它有效:)

于 2009-01-28T17:39:45.253 回答
1

外包是最有意义的。

使用以下代码编写一个类(ObservableObject):

class ObservableObject : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;

  protected void OnPropertyChanged(string name)
  {
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
  }
}

由于受保护,从此类派生的所有类都可以访问该方法。

例子:

class Example : ObservableObject
{
  //propfull
  private string name;
  public string Name
  {
    get {return name;}
    set 
    {
      name = value;
      OnPropertyChanged(nameof(Name));
    }
  }
}
于 2019-08-16T12:35:56.620 回答