您的问题是由于 C# 自动实现 event 的方式以及您用于专门检测这种情况并提供更有用的错误消息的库出现故障而发生的。
特别是,当你声明这个时:
public event PropertyChangedEventHandler PropertyChanged;
你在课堂上真正得到的是这样的:
private PropertyChangedEventHandler PropertyChanged;
public event PropertyChangedEventHandler PropertyChanged
{
add { PropertyChanged += value; }
remove { PropertyChanged -= value; }
}
多年来,add 和 remove 方法的确切实现发生了变化。实际上,以上只是示例……编译器从未真正实现过这样的事件。重要的是你得到both 一个事件和一个字段,具有相同的名称。图书馆正在寻找该领域并抱怨它。
您应该能够通过自己明确实施事件来解决此问题。例如:
[FieldIgnored]
private PropertyChangedEventHandler PropertyChangedField;
public event PropertyChangedEventHandler PropertyChanged
{
add { PropertyChanged += value; }
remove { PropertyChanged -= value; }
}
只要您不需要 add 和 remove 方法是线程安全的,这将正常工作。但是,请注意,C# 编译器确实将事件 add 和 remove 方法实现为线程安全的;如果你想遵循 C# 编译器的模式,你会想要这样的:
[FieldIgnored]
private PropertyChangedEventHandler PropertyChangedField;
public event PropertyChangedEventHandler PropertyChanged
{
add
{
PropertyChangedEventHandler eventHandler = this.PropertyChangedField;
PropertyChangedEventHandler comparand;
do
{
comparand = eventHandler;
eventHandler = Interlocked.CompareExchange<PropertyChangedEventHandler>(
ref this.PropertyChangedField,
(PropertyChangedEventHandler) Delegate.Combine(
(Delegate) comparand, (Delegate) value),
comparand);
} while (eventHandler != comparand);
}
remove
{
PropertyChangedEventHandler eventHandler = this.PropertyChangedField;
PropertyChangedEventHandler comparand;
do
{
comparand = eventHandler;
eventHandler = Interlocked.CompareExchange<PropertyChangedEventHandler>(
ref this.PropertyChangedField,
(PropertyChangedEventHandler) Delegate.Remove(
(Delegate) comparand, (Delegate) value),
comparand);
} while (eventHandler != comparand);
}
}