我有一些实现 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/