2012-01-10 103 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) => { };