2012-01-10 155 views
0

我有了一个单一的财产,它继承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事件的任何引用),那么我不会收到错误,并且我的项目运行没有任何问题。任何想法为什么?

干杯

回答

4

你是不是检查空上PropertyChanged

如果没有人在听,那么它将是空的。大多数人保护的事件监听到事件过程中改变,以及:

var listeners = PropertyChanged; 
if (listeners != null) 
    listeners(this, new PropertyChangedEventArgs("Property"); 
+0

是啊,好赶上。那将是由于查员们为空造成的例外。 – Dessus 2012-01-10 00:26:46

+0

谢谢!顺便说一句,为什么你直接使用监听器而不是PropertyChanged,就像Chris Shain的答案一样? – SuMau 2012-01-10 00:38:24

+0

这是一个非常常见的模式,即使是msdn *如何实现... *就是这样:http://msdn.microsoft.com/en-us/library/ms743695.aspx。我*听说*如果你正在做多线程的东西,PropertyChanged *属性可以在'if'和里面的代码块之间改变。本地价值不能。 – 2012-01-10 00:42:27

0

试试在类名后去掉括号():

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")); 
     } 
    } 
} 
1

在此代码没有明显导致该错误。我们需要更多信息来确定发生了什么。但是,您提供的关于INotifyPropertyChanged的提示让我相信它的PropertyChanged事件为null,并且您没有对它进行空检查。你要么需要添加空校验:

set 
    { 
     _property = value; 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs"Property")); 
    } 

或确保该事件永远不能为null:

public event PropertyChangedEventHandler PropertyChanged = (s, e) => { };