我有一个实现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
事件通知其他人,或者我应该为此目的添加自己的事件?
答案 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,因为它就在那里,那么写一个你自己的界面是个好主意。