c# - 当一个属性快速更改多次时,会发送多少个 PropertyChanged 事件?

标签 c# inotifypropertychanged

我有一些实现 PropertyChanged 事件的代码(类似于下面的代码片段)。

private void SendPropertyChanged(string propertyName)
      {
         if(PropertyChanged != null)
         {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));  
         }
      }

我注意到我的事件处理程序只被调用一次,当同一个属性被快速更改多次时。我找不到任何提到这一点的文件。谁能确认这是否是 PropertyChanged 的​​预期行为?

最佳答案

您显示的代码将调用事件委托(delegate)的次数与调用 SendPropertyChanged 的次数相同。这里没有魔法。但是,一种常见的方法(在您未显示的代码中返回一个级别)是检查实际更改,例如:

private int id;
public int Id {
    get { return id; }
    set {
        if(id != value) {
            id = value;
            SendPropertyChanged(); // let C# 5 compiler tricks supply the name
        }
    }
}
private void SendPropertyChanged([CallerMemberName]string propertyName = null)
{
    var handler = PropertyChanged;
    if(handler != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));  
    }
}

有测试:

    var obj = new Foo();
    int count = 0;
    obj.PropertyChanged += delegate { count++; };

    obj.Id = 1;
    obj.Id = 2;
    obj.Id = 3;

    Console.WriteLine(count); // outputs: 3

    count = 0;
    obj.Id = 1;
    obj.Id = 1;
    obj.Id = 1;

    Console.WriteLine(count); // outputs: 1

关于c# - 当一个属性快速更改多次时,会发送多少个 PropertyChanged 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16217847/

相关文章:

c# - 将多个word文档合并为一个Open Xml

c# - Entity Framework 中的 POCO 是什么?

C#、WPF、MVVM 和 INotifyPropertyChanged

entity-framework-4 - Entity Framework 4 : PropertyChanged event is raised too often

c# - 如何在使用嵌套属性计算值的只读属性上触发 INotifyPropertyChanged

c# - 如何反序列化嵌套的 JSON 数组?

c# - ASP.NET MVC 5 在回发时修剪字符串?

Silverlight AutoCompleteBox NotifyPropertyChanged 不更新屏幕

c# - 绑定(bind)到列表的计数,其中 Typeof

c# - XML 文档问题中的泛型