2013-07-19 17 views
14

這是一個非常簡單的問題,但我想知道是否有人能解釋第四行實際上在做什麼?所以第一行給處理程序提供了一個事件。我不知道在什麼情況下處理程序將返回null或最後一行是什麼。PropertyChangedEventHandler如何工作?

當您通過處理程序對象和哪個屬性發生更改時,它對它們做了什麼?

PropertyChangedEventHandler handler = PropertyChanged; //property changed is the event 

if (handler != null) 
{ 
    handler(this, new PropertyChangedEventArgs(name)); 
} 

我想我用這個來得到這個code但我想了解它是什麼完全做。

+0

沒有上下文很難說。你在用什麼框架?這不是BCL的一部分,它可能是您正在檢查/使用的一些MVVM框架。 – Will

+0

這看起來不像'PropertyChangedEventHandler'特有的東西。這就是處理程序的工作原理。 –

+0

威爾的評論是無稽之談。這被標記爲WPF。 PropertyChangedEventHandler在System.ComponentModel中。 MVVM框架沒有這樣的東西--MVVM是一種對WPF有用但對WPF不必要的架構模式。無論如何,這個問題是關於事件處理程序如何在C#中工作的,答案不是特定於任何特定事件或框架。 –

回答

35

如果你只是做:

PropertyChanged(this, new PropertyChangedEventArgs(name)) 

,你會得到一個NullReferenceException如果沒有人訂閱了該事件PropertyChanged。爲了解決這個問題,你添加一個空檢查:

if(PropertyChanged != null) 
{ 
    PropertyChanged(this, new PropertyChangedEventArgs(name)) 
} 

現在,如果你正在使用多線程有人空校驗和事件的調用之間可以退訂,所以你仍然可以得到一個NullReferenceException。爲了處理我們的事件處理程序複製到一個臨時變量

PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
    handler(this, new PropertyChangedEventArgs(name)); 
    } 

現在,如果有人從事件我們的臨時變量handler仍將指向舊的功能退訂這個代碼現在已經沒有扔NullReferenceException的方式。

大多數情況下您會看到人們使用關鍵字var來代替,這使得您無需輸入臨時變量的完整類型,這是您在代碼中最常見的形式。

var handler = PropertyChanged; 
    if (handler != null) 
    { 
    handler(this, new PropertyChangedEventArgs(name)); 
    } 
+0

在競爭條件下,不會複製處理程序,然後調用某個剛纔指定的函數不應再被調用?這僅僅是接受的做生意的方式,還是有我缺少的東西? –

+1

@ZachMierzejewski是的,這是預期的行爲。訂閱者有責任瞭解,即使在多線程情況下取消訂閱,仍然可以最終調用該方法。內置到.NET中的所有類的事件都以這種模式運行。 –

6

handler如果沒有處理程序是subscribedevent可以爲空,則第四行將引發給定屬性名稱(執行所有預訂的處理程序)的事件。

當您使用綁定時,通常WPF框架將訂閱PropertyChanged,因此它可以在綁定屬性更改後更新綁定。

7

PropertyChanged是被宣佈這樣的情況下,根據其在接口定義:

public event PropertyChangedEventHandler PropertyChanged; 

Events被這樣的定義實際上是事件處理程序的列表,你可以添加一個語法糖委託(即對功能的引用)通過訂閱或通過取消訂閱來刪除委託。

現在,當您調用一個事件,即PropertyChanged(...)時,內部發生的是內部列表中的每個委託與參數分開調用。這將告訴您的活動的所有訂戶該事件發生。

現在,與handler變量整個事情的原因是,那PropertyChanged可以爲空。如果沒有訂閱它,那麼調用事件(或者事件處理程序列表)將不起作用,所以這只是確保您可以真正執行處理程序的一種方法。

相關問題