2013-01-31 27 views
0

我有一個客戶端服務器應用程序。 從服務器我得到一個簡單的數據傳輸對象。 例如我有一個WPF應用程序,所以我不得不使用INotifyPropertyChanged。 現在我尋找一種優雅的方式在我的對象中實現這一點。我的優點是大多數對話框只顯示,所以沒有理由在那裏實現它,因爲在這些情況下,整個對象將被切換(爲此,我在包含對象的ViewModel中使用INotifyPropertyChanged)。現在我有一種情況,房地產在更深的結構中發生變化,我的觀點沒有注意到。使用單例類的事件處理程序爲空

我嘗試用繼承和擴展來解決它。 我寫了「自己」的課。

public class PersonCm : Person 
{ 
    public new string Course 
    { 
     get 
     { 
     return base.Course; 
     } 
     set 
     { 
     base.Course = value; 
     this.PropertyChanged(); 
     } 
} 

因此,我從我的基類和「覆蓋」只有這些我需要我的INotifyPropertyChanged所有屬性。要添加我的功能,我使用以下兩個類:

public class ClientFunctions : INotifyPropertyChanged 
{ 
    public static readonly ClientFunctions Instance = new ClientFunctions(); 

    private ClientFunctions() 
    { 
     // Empty 
    } 

    [field: NonSerialized] 
    public event PropertyChangedEventHandler PropertyChanged; 

    public bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = "") 
    { 
     if (object.Equals(storage, value)) 
     { 
     return false; 
     } 

     storage = value; 
     this.OnPropertyChanged(propertyName, storage); 
     return true; 
    } 

    public void OnPropertyChanged(string propertyName, object sender) 
    { 

     var eventHandler = this.PropertyChanged; 
     if (eventHandler != null) 
     { 
     eventHandler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

INotifyPropertyChanged代碼的單例類。

public static class Extension 
{ 
    public static void PropertyChanged(this BaseObject obj, [CallerMemberName] string propertyName = "") 
    { 
    ClientFunctions.Instance.OnPropertyChanged(propertyName, obj); 
    } 
} 

和一個擴展,它調用我的單例類。

我現在的問題是,每次我打電話給我的INotifyPropertyChanged代碼我的PropertyChangedEventHandler爲空,我不知道爲什麼。

有沒有人有我的想法或提示。

回答

0

從我所看到的你有一個物件(你的PersonCm)有一個屬性,但是當它的屬性改變時,擴展方法導致ClientFunctions.Instance對象產生一個PropertyChanged事件。 PropertyChanged只會訂閱,如果你綁定到該對象的屬性。包含你的財產的對象肯定必須使用自己的PropertyChanged事件(例如通過繼承一個基類)來實現INotifyPropertyChanged本身。

(如果沒有訂閱該事件PropertyChanged將是無效的 - 即沒有被綁定到任何屬性的對象上)

+0

謝謝。沒有人訂閱我的ClientFunctions。 我將INotifyPropertyChanged添加到我的Cm-class,並使用添加和刪除將訂閱鏈接到我的ClientFunctions。 – Sukram

1

在你 PersonCm類,你需要通過屬性的名稱被更改。

public class PersonCm : Person 
{ 
    public new string Course 
    { 
     get 
     { 
     return base.Course; 
     } 
     set 
     { 
     base.Course = value; 
     this.PropertyChanged("Course"); // should fix it 
     } 
} 

編輯

我看你現在正在做的[CallerMemberName]使用所以這不是修復。

看起來像ClientFunctions.Instance.PropertyChanged永遠不會訂閱。