【问题标题】:Should I raise INotifyPropertyChanged events if I don't have a corresponding property with that name on my class?如果我的班级没有具有该名称的相应属性,我应该引发 INotifyPropertyChanged 事件吗?
【发布时间】:2012-08-11 19:56:43
【问题描述】:

我有一个实现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 事件通知其他人,还是我应该为此添加自己的事件?

【问题讨论】:

    标签: c# events inotifypropertychanged


    【解决方案1】:

    我建议您添加自己的。尽管没有具体原因会导致代码中断,但INotifyPropertyChanged 具有特定的预期用途,并且许多潜在消费者都能理解。我不会亲自编写与之相矛盾的代码,以防万一。

    【讨论】:

    • 我打算提出相反的建议,但仔细想想,我认为我同意丹的观点。如果你的类同时实现了普通属性和动态属性,我认为至少有一个单独的事件会通知消费者在哪里可以找到该属性。
    【解决方案2】:

    据我所知,为不存在的财产筹集PropertyChanged 并没有什么坏处,但我认为它也不是很有用。 INotifyPropertyChanged 主要用于数据绑定系统(在 WinForms、WPF、Silverlight...中),这些系统不知道如何访问您的自定义“属性”。

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

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

    【讨论】:

      【解决方案3】:

      从技术上讲,这取决于谁订阅了PropertyChanged,以及他们为响应PropertyChanged 事件而做了什么。如果他们不尝试读取 .NET“属性”,那就没问题了。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 2012-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多