1

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

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

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

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

我想创建一个基类来实现它(NotifyPropertyChangedObject也许是为了名字),但这可能是一个坏主意,它会真正限制我的类而没有多重继承。
我也想到了一个扩展方法,但我想把它作为一种protected方法,所以这也行不通。

可以做些什么来解决这个问题?

4

3 回答 3

3

拥有一个基类是甚至 MVVM Helper 库所做的方法。没有缺点。

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

现在,如果当前您有 ClassX继承自 Class A,只需让 A 继承自ViewModelBase

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

更新

在您的特殊情况下,无论出于何种原因,您都与已经拥有另一个基类相关联,并且没有说诸如 INPC 的公共实现之类的东西作为成员变量传递给该对象,

你可以试试看这个:

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

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

于 2013-03-26T11:51:06.450 回答
0

通过@viv添加答案。如果您已经决定使用Fody + PropertyChanged,我建议您避免使用基类。由于 PropertyChanged 为您完成了所有的 INPC 实现,因此拥有一个基类真的没有什么价值。事实上,痛苦多于价值。只需将PropertyChanged.ImplementPropertyChanged属性添加到您的类,其余的将为您完成。

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

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

于 2013-03-30T00:18:49.237 回答
0

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

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

如果您还没有,请查看 MVVM 模型。以上只是无数方法之一,确实是我的解释,有些人可能不同意,也可能不适合您的特定情况。

于 2013-03-26T11:51:56.237 回答