如果我的班级上没有相应的具有该名称的属性,我应该提高INotifyPropertyChanged事件吗?

时间:2012-08-15 14:02:35

标签: c# events inotifypropertychanged

我有一个实现INotifyPropertyChanged的类,有自己的属性概念,有点像这样:

class sealed MyClass : INotifyPropertyChanged
{
    private Dictionary<string, object> _properties;

    public object GetProperty(string name)
    {
        return _properties[name];
    }

    public object SomeProperty
    {
        get
        {
            return GetProperty("SomeProperty");
        }
    }
}

请注意,一些常见属性也有C#访问器。

我想引发一个事件来通知其他人一个属性(其值通过GetProperty方法访问)已更改,即使此属性没有相应的C#访问者。

假设不存在冲突的风险(即无意中为C#属性提升属性更改事件,其值未发生变化 - 请注意此类是密封的),有什么理由我不能使用INotifyPropertyChanged.PropertyChanged事件通知其他人,或者我应该为此目的添加自己的事件?

3 个答案:

答案 0 :(得分:2)

我建议您添加自己的。虽然代码没有特定原因可以破解,但INotifyPropertyChanged具有特定的预期用途,并且被许多潜在消费者理解。我不会亲自编写与此相反的代码,以防万一。

答案 1 :(得分:0)

据我所知,对于不存在的财产提出PropertyChanged没有任何害处,但我认为这也不是很有用。 INotifyPropertyChanged主要用于数据绑定系统(在WinForms,WPF,Silverlight ......中),这些系统不知道如何访问自定义“属性”。

现在,您可以执行ICustomTypeDescriptor以标准方式提供对自定义属性的访问权限。这适用于Windows窗体和WPF,我不确定其他框架。

当然,如果您不打算将其用于数据绑定,您仍然可以使用此事件通知您的类的消费者值已更改。

答案 2 :(得分:0)

从技术上讲,这取决于谁已订阅PropertyChanged他们为响应PropertyChanged事件所做的。如果他们不尝试读取.NET“属性”,那就没事了。

但是,这确实引入了耦合,INPC的使用正试图解耦。 INPC在一般情况下假设PropertyChanged表示.NET属性(给定名称)已更改,并且预计所有使用INPC的地方都是如此。即你实现INPC,因为你想在接受INPC的任何的地方使用你的对象。如果您的对象不能这样做,那么它违反了INPC的隐含合同。如果你有一个PropertyChanged处理程序做了一些不同于读取属性的东西而且你正在重新使用INPC,因为它就在那里,那么写一个你自己的界面是个好主意。