重新实现相同的事件调用(Re-implementing the same event invoker

2019-10-17 22:06发布

我写了几类,我想通过实施,使他们所有的“数据绑定兼容”(WPF的,甚至可能是罕见的WinForms) INotifyPropertyChanged的 。

问题是重复的代码。 其实,我复制粘贴一次同样的方法一遍又一遍(我不是在开玩笑)。

protected void OnPropertyChanged([CallerMemberName] String propertyName = null)
{
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

我有这个问题了一段时间,但今天具体地说,它只是不断一再上演,所以我希望你能帮我一个解决方案。 我有这个方法几乎一打类和我真的很讨厌重复这段代码。

我想(创建一个基类,将实现它的NotifyPropertyChangedObject的名称可能),但可能是一个坏主意真的会限制我的课没有多重继承。
我还想到一个扩展方法,但我想它的范围作为protected方法,这样就不能工作。

可以采取哪些措施来解决这个问题?

Answer 1:

有一个基类甚至MVVM助手库做的方法。 还有就是没有缺点。

是的,你只能有一个C#类的基类,但有它实现多个接口。 对于你的情况下,所有你需要做的是说有一个基类实现INPC并调用它ViewModelBase

现在,如果你目前有类X继承自Class A ,只要从A继承ViewModelBase

你因此从而使当前的基类,从这个新的INPC提供一流的继承和你没有任何派生类的INPC执行任意代码重复

更新

在你的特殊情况下,你在哪里,无论出于何种原因扎成已经有另一个基类,与不具有的限制,这样说公实施INPC传递给这个对象作为成员变量,

您可以尝试在看看这个:

Fody ,特别是它的插件的PropertyChanged -附加组件

这希望能帮助你,因为它注入了INPC实现自身,因此不要求你复制和粘贴代码,它也然后允许你从任何自定义的基类派生(仍需要在这里指定INPC但是那只是一个接口)



Answer 2:

我通常我的看法绑定到视图模型类型的对象,即包含该视图所需的所有数据的对象。 这使得系统更易于对作为视图工作必须绑定到只有一个对象。

我通常会再有我的业务对象暴露的数据视图模型,并公开一个事件,以通知其状态已经改变视图模型,在该点视图模型将调用相关的属性具体通知到视图。 即你只需要每视图/视图模型一旦实施上述方法。

看看进入MVVM模式,如果你还没有准备好。 以上只是众多途径之一,确实是我的解释其中的一些可能不同意,并可能会或可能不适合你的特殊情况。



Answer 3:

要通过@viv添加到答案。 如果您已经决定使用Fody + 的PropertyChanged我建议避免基类。 由于的PropertyChanged做所有的INPC实施你真的是有在具有基类的价值很小。 事实上,有比没有价值更多的痛苦。 就在加PropertyChanged.ImplementPropertyChanged属性类,其余的将替您完成。

[ImplementPropertyChanged]
public class Person 
{
    public string Name { get; set; }
}

你不要自己,因此关于类可以为落实INPC。 最好的方法是创建一个重复的类,表示要绑定到每个类的简化版本。 你可以阅读,当你加载和你的看法写结束的值。 或者,如果你只是想绑定到特定属性只是将这些礼节上的主视图模型。



文章来源: Re-implementing the same event invoker