我有几个具有PropetyChanged事件的对象的后端。更改某些属性后,将触发通知。在前端,我有用WPF编写的GUI,并且几个属性直接绑定到WPF小部件。
为了使GUI响应,所有计算都在另外的线程中完成。
所以,一般来说,经典的WPF应用程序。
public void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name)); // (*)
}
此代码发送通知,但它会在(*)处抛出异常,因为PropertyChanged为null(是的,只有 检查null之后)。
我的猜测是因为在WPF中重新绑定 - 在我的代码中我更改了发件人,因此WPF必须取消注册接收者并将其注册到新发件人。很少抛出异常(我每执行约40000次执行一次异常,每次执行大约相当于发送者的一次更改)但确实会发生。
现在 - 如何正确锁定PropertyChange,所以我可以检查null并将通知作为原子操作发送?我不想通过试用&错误,因为我可以在每次执行第1M次时发现副作用。
答案 0 :(得分:5)
有一种模式可以解决这个问题:
var evt = PropertyChanged;
if ( evt != null ) evt( this, new PropertyChangedEventArgs( name ) );
答案 1 :(得分:1)
您可以在事件属性声明中拦截事件连接
private PropertyChangedEventHandler _propertyChanged;
public PropertyChangedEventHandler PropertyChanged
{
add
{
// intercept here
_propertyChanged += value;
}
remove
{
// intercept here
_propertyChanged -= value;
}
}