重新实现相同的事件调用程序

时间:2013-03-26 11:43:12

标签: c# wpf data-binding inotifypropertychanged

我正在编写一些类,我想通过实现INotifyPropertyChanged使它们全部符合“数据绑定”(对于WPF,甚至可能更罕见的WinForms)。

问题是重复的代码。我实际上一遍又一遍地复制粘贴相同的方法(我不是在开玩笑)。

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

我有一段时间没有这个问题,但今天特别是它一次又一次地发生,所以我希望你能帮我解决问题。我有几十个有这种方法的类,我真的不想重复那段代码。

我想过要创建一个实现它的基类(可能是名字NotifyPropertyChangedObject),但这可能是一个糟糕的主意,它会在没有多重继承的情况下限制我的类。
我也想到了扩展方法,但我想将其作为protected方法的范围,因此也不会。

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

3 个答案:

答案 0 :(得分:3)

拥有基类是MVVM Helper库的方法。这没有任何缺点。

是的,c#类只能有一个基类,但它实现了多个接口。对于你的情况,你所要做的就是说有一个基类实现INPC并称之为ViewModelBase

现在,如果您目前从班级X继承了班级A,那么只需让A继承自ViewModelBase

因此,您因此使您当前的基类继承自这个新的INPC提供类,并且您在任何派生类中没有任何代码重复用于INPC实现

<强>更新

在你的特殊情况下,无论出于何种原因,你已经拥有了另一个基类并且没有说像INPC的公共实现作为成员变量传递给这个对象的限制,

你可以尝试看看这个:

Fody,特别是它的插件PropertyChanged - Addon

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

答案 1 :(得分:0)

我通常将视图绑定到视图模型类型对象,即包含视图所需的所有数据的对象。这使得系统更容易处理,因为视图必须只绑定到一个对象。

然后,我通常会将业务对象公开数据到视图模型并公开单个事件以通知视图模型其状态已更改,此时视图模型将向视图调用相关的属性特定通知。 即每个视图/视图模型只需实现一次上述方法。

如果您还没有,请查看MVVM模型。以上只是众多方法中的一种,实际上是我的解释,有些人可能不同意,哪些可能适合您的特定情况。

答案 2 :(得分:0)

添加@viv的答案。如果您已经决定使用Fody + PropertyChanged,我建议您避免使用基类。由于PropertyChanged为您完成了所有INPC实现,因此拥有基类的价值确实很小。事实上,有更多的痛苦而不是有价值。只需将PropertyChanged.ImplementPropertyChanged属性添加到您的课程中,其余部分就会为您完成。

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

关于您不拥有的类,因此可以实现INPC。最好的方法是创建一个重复的类,表示要绑定到的每个类的简化版本。您可以在加载和完成视图时读取和写入值。或者,如果您只想绑定到某些属性,只需将这些属性放在主视图模型上即可。

相关问题