我写了几类,我想通过实施,使他们所有的“数据绑定兼容”(WPF的,甚至可能是罕见的WinForms) INotifyPropertyChanged的 。
问题是重复的代码。 其实,我复制粘贴一次同样的方法一遍又一遍(我不是在开玩笑)。
protected void OnPropertyChanged([CallerMemberName] String propertyName = null)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
我有这个问题了一段时间,但今天具体地说,它只是不断一再上演,所以我希望你能帮我一个解决方案。 我有这个方法几乎一打类和我真的很讨厌重复这段代码。
我想(创建一个基类,将实现它的NotifyPropertyChangedObject
的名称可能),但可能是一个坏主意真的会限制我的课没有多重继承。
我还想到一个扩展方法,但我想它的范围作为protected
方法,这样就不能工作。
可以采取哪些措施来解决这个问题?
有一个基类甚至MVVM助手库做的方法。 还有就是没有缺点。
是的,你只能有一个C#类的基类,但有它实现多个接口。 对于你的情况下,所有你需要做的是说有一个基类实现INPC并调用它ViewModelBase
现在,如果你目前有类X
继承自Class A
,只要从A继承ViewModelBase
。
你因此从而使当前的基类,从这个新的INPC提供一流的继承和你没有任何派生类的INPC执行任意代码重复
更新
在你的特殊情况下,你在哪里,无论出于何种原因扎成已经有另一个基类,与不具有的限制,这样说公实施INPC传递给这个对象作为成员变量,
您可以尝试在看看这个:
Fody ,特别是它的插件的PropertyChanged -附加组件
这希望能帮助你,因为它注入了INPC实现自身,因此不要求你复制和粘贴代码,它也然后允许你从任何自定义的基类派生(仍需要在这里指定INPC但是那只是一个接口)
我通常我的看法绑定到视图模型类型的对象,即包含该视图所需的所有数据的对象。 这使得系统更易于对作为视图工作必须绑定到只有一个对象。
我通常会再有我的业务对象暴露的数据视图模型,并公开一个事件,以通知其状态已经改变视图模型,在该点视图模型将调用相关的属性具体通知到视图。 即你只需要每视图/视图模型一旦实施上述方法。
看看进入MVVM模式,如果你还没有准备好。 以上只是众多途径之一,确实是我的解释其中的一些可能不同意,并可能会或可能不适合你的特殊情况。
要通过@viv添加到答案。 如果您已经决定使用Fody + 的PropertyChanged我建议避免基类。 由于的PropertyChanged做所有的INPC实施你真的是有在具有基类的价值很小。 事实上,有比没有价值更多的痛苦。 就在加PropertyChanged.ImplementPropertyChanged
属性类,其余的将替您完成。
[ImplementPropertyChanged]
public class Person
{
public string Name { get; set; }
}
你不要自己,因此关于类可以为落实INPC。 最好的方法是创建一个重复的类,表示要绑定到每个类的简化版本。 你可以阅读,当你加载和你的看法写结束的值。 或者,如果你只是想绑定到特定属性只是将这些礼节上的主视图模型。