我有一個數據源與泛型類型T如下。如何實現一個泛型類T的Inotifypropertychanged?
public class GridObjectDataSource<T>
{
}
T是從外部客戶端,其中INotifyPropertyChanged的不落實,未來我們在泛型類T.任何屬性更改上面的類可以實現,因爲我需要顯示在用戶界面的變化。
我有一個數據源與泛型類型T如下。如何實現一個泛型類T的Inotifypropertychanged?
public class GridObjectDataSource<T>
{
}
T是從外部客戶端,其中INotifyPropertyChanged的不落實,未來我們在泛型類T.任何屬性更改上面的類可以實現,因爲我需要顯示在用戶界面的變化。
是的,你可以實現你的泛型類,因爲它只是定義了必須執行的事件:
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)
{
}
}
請注意,簡單地實現接口並不會自動添加您期望的行爲。如果直接更改底層的'T'對象,那麼您的'GridObjectDataSource
@Dirk是的,如果你想知道屬性何時發生變化,'T'本身也必須實現'INotifyPropertyChanged'。 – slugster
如果T已經實現INotifyPropertyChanged,那麼上面的代碼就不需要了。因爲它只更新對象本身。 – user3355293
你能做的最好的是定義約束
public class GridObjectDataSource<T> where T : INotifyPropertyChanged
{
}
因爲你可以不改變通用類T
你應該爲你的泛型類編寫viewmodels。如果他們有一個共同的界面,你只需要一個視圖模型。如果它們完全不同,你應該爲每種類型都有一個視圖模型。
見MSDN Patterns - WPF Apps With The Model-View-ViewModel Design Pattern
請檢查[這](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)可能會幫助你! –