实例化一个继承INotifyPropertyChanged的
问题描述:
我有了一个单一的财产,它继承INotifyPropertyChanged的一个非常简单的类的类:实例化一个继承INotifyPropertyChanged的
class SimpleClass:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _property;
public string Property
{
get { return _property; }
set
{
_property = value;
PropertyChanged(this, new PropertyChangedEventArgs"Property"));
}
}
}
我尝试实例在构造函数中的WPF窗口一个SimpleClass对象,但我得到的跟踪TargetInvocationException:“调用的目标引发异常”。 如果我删除INotifyPropertyChange继承(以及对PropertyChanged事件的任何引用),那么我不会收到错误,并且我的项目运行没有任何问题。任何想法为什么?
干杯
答
你是不是检查空上PropertyChanged
。
如果没有人在听,那么它将是空的。大多数人保护的事件监听到事件过程中改变,以及:
var listeners = PropertyChanged;
if (listeners != null)
listeners(this, new PropertyChangedEventArgs("Property");
答
试试在类名后去掉括号():
public class SimpleClass:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _property;
public string Property
{
get { return _property; }
set
{
_property = value;
PropertyChanged(this, new PropertyChangedEventArgs("Property"));
}
}
}
答
在此代码没有明显导致该错误。我们需要更多信息来确定发生了什么。但是,您提供的关于INotifyPropertyChanged的提示让我相信它的PropertyChanged事件为null,并且您没有对它进行空检查。你要么需要添加空校验:
set
{
_property = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs"Property"));
}
或确保该事件永远不能为null:
public event PropertyChangedEventHandler PropertyChanged = (s, e) => { };
是啊,好赶上。那将是由于查员们为空造成的例外。 – Dessus 2012-01-10 00:26:46
谢谢!顺便说一句,为什么你直接使用监听器而不是PropertyChanged,就像Chris Shain的答案一样? – SuMau 2012-01-10 00:38:24
这是一个非常常见的模式,即使是msdn *如何实现... *就是这样:http://msdn.microsoft.com/en-us/library/ms743695.aspx。我*听说*如果你正在做多线程的东西,PropertyChanged *属性可以在'if'和里面的代码块之间改变。本地价值不能。 – 2012-01-10 00:42:27