我有一些代码实现了PropertyChanged事件(类似于下面的代码片段)。
private void SendPropertyChanged(string propertyName)
{
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
我注意到我的事件处理程序只调用一次,当同一属性很快被更改几次时。我找不到任何提到这个的文档。任何人都可以确认这是否是PropertyChanged的预期行为?
答案 0 :(得分: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
答案 1 :(得分:1)
请记住,C#事件实际上不仅仅是一个函数调用。常规函数调用有两个主要区别: -
对于事件,被调用者依赖于调用者,而不是相反。
事件可以有一个调用列表,也就是说,多个被调用者可以连接到一个调用者。
事件提升机制中没有内置限制,因此您所看到的效果必须有不同的解释。