c# - 使用属性... INotifyPropertyChanged

标签 c# .net wpf wcf

这只是我在学习 Attributes 时的想法,我使用 INotifyPropertyChanged 太多了,这只是一个想法,我想听听一些关于它的意见。(我知道这需要一些工作编译器而不是消费者端)

由于 INotifyPropertyChanged 大多数时候与相同的模式一起使用.. 就像调用使用属性名称触发事件的方法一样,是否可以将其设计为属性并使用自动属性?以便编译器知道它需要添加对 PropertyChanged 事件的调用? 所以如果我们上课....

public class DemoCustomer : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

  private string companyNameValue = String.Empty;
         ...
}

而不是声明属性

public string CompanyName
    {
        get
        {
            return this.companyNameValue;
        }

        set
        {
                       if (value != this.companyNameValue)
                       {
                          this.companyNameValue = value;
                          NotifyPropertyChanged("CompanyName");
                       }
        }
    }

如果我们可以通过此属性向编译器指示它需要在新值与先前值不同时使用属性名称生成对 PropertyChanged 的​​调用,我们就可以做这样的事情

[NotifyPropertyChanged]
public string CompanyName
{
  get;set;
}

在不使用 Attribute 的情况下,我们仍然可以用旧的方式为一些自定义行为编码。

最佳答案

以防万一有人遇到此线程并使用 C# 5(VS 2012+、.NET 4.5+)。现在使用 CallerMemberNameAttribute 可以“更轻松地”完成这种情况。此属性应用于字符串参数,并导致编译器在我们使用默认值时(即未传递参数时)传递调用方法/属性的名称。使实现 INotifyPropertyChanged 变得不那么烦人。例如:

public class MyClass
{
    private string myProperty;

    public string MyProperty
    {
        get { return myProperty; }
        set
        {
            myProperty = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

因此,您只需要在每个 setter 中使用 OnPropertyChanged() 来发送事件,而不必处理属性名称的硬编码字符串。

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

相关文章:

c# - 如何获取哈希表条目的键

c# - .NET 写一个文件,附加文件版本信息

c# - ASP.NET MVC 表单验证每次都失败

c# - 设置 textBox.Text 不会更新绑定(bind)的双向属性?

c# - Akka.net - 如何等待子 Actor 在停止之前处理所有未决消息

c# - 在 xamarin 中启用 ARC

C# WPF - 切换某些内容的可见性不起作用

c# - 如何探索正在运行的 wpf 应用程序?

c# - Web.Config 中的通用处理程序注册

c# - 使用 WebBrowser Winforms 控件通过 SSL 访问内网