1

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

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

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

4

2 回答 2

3

您显示的代码将调用事件委托的次数与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
于 2013-04-25T14:48:58.020 回答
1

请记住,C# 事件实际上只不过是一个函数调用。与常规函数调用有两个主要区别:-

  1. 对于事件,被调用者依赖于调用者,而不是相反。

  2. 事件可以有一个调用列表,即多个被调用者可以附加到一个调用者。

事件引发机制中没有内置限制,因此您看到的效果必须有不同的解释。

于 2013-04-25T14:50:04.487 回答