如何为通用类T实现Inotifypropertychanged?

时间:2014-03-12 09:43:45

标签: c# wpf

我有一个通用类型为T的数据源,如下所示。

 public class GridObjectDataSource<T>
{
}

T来自外部客户端,其中没有实现InotifyPropertychanged,我们是否可以在上面的类中实现泛型类T中的任何属性更改。因为我需要在UI中显示更改。

3 个答案:

答案 0 :(得分: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>用作抽象基类并且派生类(viewmodels等)指定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)
    {

    }
}

答案 1 :(得分:0)

您可以做的最好的事情是定义约束

public class GridObjectDataSource<T> where T : INotifyPropertyChanged
        {
        }

答案 2 :(得分:0)

由于您无法对泛型类T进行任何更改,因此您必须为泛型类编写视图模型。如果他们有一个通用接口,您只需要一个视图模型。如果它们都不同,则每种类型都应该有一个视图模型。

请参阅MSDN Patterns - WPF Apps With The Model-View-ViewModel Design Pattern