当一个属性非常快地更改了几次时,发送了多少PropertyChanged事件
本文关键字:几次 事件 PropertyChanged 多少 一个 属性 非常 | 更新日期: 2023-09-27 18:10:57
我有一些实现PropertyChanged事件的代码(类似于下面的代码片段)。
private void SendPropertyChanged(string propertyName)
{
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
我注意到我的事件处理程序只被调用一次,当相同的属性被非常快地改变几次时。我找不到任何提到这一点的文档。有人能确认这是否是PropertyChanged的预期行为吗?
您所展示的代码将调用事件委托的次数与调用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#事件实际上只不过是一个函数调用。与常规函数调用有两个主要区别:-
-
对于事件,被调用方依赖于调用方,而不是依赖于调用方。
-
事件可以有一个调用列表,即单个调用者可以附加多个被调用者
事件引发机制中没有内置节流,所以您看到的效果一定有不同的解释。