我正在写一些类,我想通过实现INotifyPropertyChanged使它们都"数据绑定兼容"(对于WPF,甚至可能更罕见的WinForms)。
问题是代码重复。我实际上一遍又一遍地复制粘贴相同的方法(我不是开玩笑)。
protected void OnPropertyChanged([CallerMemberName] String propertyName = null)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
我有这个问题有一段时间了,但今天它只是一次又一次地发生,所以我希望你能帮助我解决这个问题。我有十几个类都有这个方法,我真的很讨厌重复这段代码。
我想创建一个基类,将实现它(NotifyPropertyChangedObject
的名称可能),但这可能是一个坏主意,将真正限制我的类没有多重继承。
我也想到了一个扩展方法,但我想把它作为protected
方法的范围,所以这也行不通。
如何解决这个问题?
拥有一个基类是MVVM Helper库所做的方法。这没有缺点。
是的,你可以为一个c#类只有一个基类,但让它实现多个接口。对于你的情况,你所要做的就是创建一个实现INPC的基类并将其命名为ViewModelBase
如果现在你的X
类从A
类继承,只需让A类从ViewModelBase
继承。
因此,您可以使当前的基类继承这个新的INPC提供类,并且在您的任何派生类中没有任何INPC实现的代码复制
在你的特殊情况下,无论出于何种原因,你已经绑定了另一个基类,并且限制了诸如INPC的公共实现作为成员变量传递给该对象,
你可以试着看看这个:
Fody,特别是它的addon PropertyChanged - addon
这将有希望帮助你,因为它注入INPC实现本身,因此不需要你复制粘贴代码,它还允许你从任何自定义基类派生(仍然需要指定INPC,但这只是一个接口)
我通常将视图绑定到视图模型类型对象,即包含视图所需的所有数据的对象。这使得系统更容易工作,因为视图必须只绑定到一个对象。
我通常会让我的业务对象向视图模型公开数据,并公开一个事件来通知视图模型它的状态发生了变化,此时视图模型将向视图调用相关的属性特定通知。也就是说,你只需要在每个视图/视图模型中实现上述方法一次。看看MVVM模型,如果你还没有。以上只是无数方法中的一种,确实是我的解释,有些人可能不同意,也可能不适合您的特定场景。
通过@viv添加答案。如果您已经决定使用Fody+PropertyChanged,我建议避免使用基类。因为PropertyChanged为你完成了所有的INPC实现,所以拥有一个基类真的没有什么价值。事实上,痛苦比价值还多。只需将PropertyChanged.ImplementPropertyChanged
属性添加到类中,其余的将为您完成。
[ImplementPropertyChanged]
public class Person
{
public string Name { get; set; }
}
关于你不拥有的类,因此可以实现INPC。最好的方法是创建一个重复的类,它表示要绑定到的每个类的简化版本。您可以在加载和完成视图时读取和写入这些值。或者,如果你只想绑定到某些属性,只需将这些属性放在你的主视图模型上。