[Windows Phone] NotifyPropertyChanged 方法的作用

在 ItemViewModel.cs 中的預設屬性在 Set 時呼叫了 NotifyPropertyChanged 方法,本文說明這個方法有什麼作用,如果沒有呼叫會不會對程式產生影響?

 

前言

最近有上架一個 Windows Phone 應用程式,是從開放平台下載資料到 Windows Phone 應用程式進行處理與顯示,其中我透過了小技巧,將 JSON 資料複製,並且透過 [貼上 JSON 為類別] 的方式產生類別與屬性。

 

貼上並整理後,如下圖 (2) 的部分是新增的屬性,圖 (1) 是預設的屬性。

 

雖然應用程式可以順利執行,將資料分析並且處理後加入這些屬性當中,但我產生了一個疑問,為什麼預設屬性在 Set 時呼叫了 NotifyPropertyChanged 方法,這個方法有什麼作用,如果沒有呼叫會不會對程式產生影響?

 

說明

NotifyPropertyChanged 方法的程式碼如下所示:

 


        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (null != handler)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

 

詢問教練和搜尋網路上的文章,了解到 NotifyPropertyChanged 方法,透過繼承 INotifyPropertyChanged 介面來實現屬性資料有變更時,告知用戶端屬性值已變更。

所以在屬性 Set 時呼叫 NotifyPropertyChanged 方法,會告知用戶端程式屬性已經變更,進而更新畫面中有綁定該屬性的控制項畫面。

 

實作

我使用我先前上架的應用程式,先加入一個 Button,在 Button Click 時,變更資料來源的第一筆資料,其中的屬性 LineOne 和 LineThree。

 

程式碼:

 


        private void TEST_Click(object sender, RoutedEventArgs e)
        {
            App.ViewModel.Items[0].LineOne = "TEST ONE";
            App.ViewModel.Items[0].LineThree = "TEST THREE";
        }

 

接著我將 LineThree 屬性中,Set 時呼叫 NotifyPropertyChanged 方法的部分註解。

 

執行程式後,一開始會顯示網路上下載的資料。

 

按下按鈕,變更資料來源第一筆資料。

 

可以看到控制項綁定 LineOne 屬性的畫面有更新,顯示為新資料,但控制項綁定 LineThree 屬性的畫面沒有更新,還是舊資料。

 

相關參考與引用

INotifyPropertyChanged 介面