2014-03-12 54 views
1

我有一個數據源與泛型類型T如下。如何實現一個泛型類T的Inotifypropertychanged?

public class GridObjectDataSource<T> 
{ 
} 

T是從外部客戶端,其中INotifyPropertyChanged的不落實,未來我們在泛型類T.任何屬性更改上面的類可以實現,因爲我需要顯示在用戶界面的變化。

+0

請檢查[這](http://stackoverflow.com/questions/1315621/implementing-inotifypropertychanged-does-a-better-way-exist)和[這裏](HTTP:// geekswithblogs.net/brians/archive/2010/07/27/inotifypropertychanged-with-less-code-using-generics-amp-reflection.aspx)可能會幫助你! –

回答

1

是的,你可以實現你的泛型類,因爲它只是定義了必須執行的事件:

public class MyClass<T> : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

的委託該屬性並不要求比屬性名稱和提升事件的對象的實例引用更加特殊,但不需要泛型魔術。

你的消費類可以簡單地鉤到它:

var instanceOfMyClass = new MyClass<SomeObject>(); 
instanceOfMyClass.PropertyChanged += theHandlerForTheEvent; 

......或者......

instanceOfMyClass.PropertyChanged += (o, e) => { do something; }; 

你似乎什麼實際做使一個很好的模式,當使用GridObjectDataSource<T>作爲抽象基類和派生類(視圖模型等)指定實際類型T

public abstract class GridObjectDataSource<T> : INotifyPropertyChanged 
{ 
    public abstract void DoSomething(T someInput); 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 


public class MySpecificViewModel : GridObjectDataSource<int> 
{ 

    public override void DoSomething(int someInput) 
    { 

    } 
} 
+0

請注意,簡單地實現接口並不會自動添加您期望的行爲。如果直接更改底層的'T'對象,那麼您的'GridObjectDataSource '無法知道這一點。而'PropertyChanged'永遠不會被提出。 – Dirk

+0

@Dirk是的,如果你想知道屬性何時發生變化,'T'本身也必須實現'INotifyPropertyChanged'。 – slugster

+0

如果T已經實現INotifyPropertyChanged,那麼上面的代碼就不需要了。因爲它只更新對象本身。 – user3355293

0

你能做的最好的是定義約束

public class GridObjectDataSource<T> where T : INotifyPropertyChanged 
     { 
     } 
相關問題