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



我正在写一些类,我想通过实现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。最好的方法是创建一个重复的类,它表示要绑定到的每个类的简化版本。您可以在加载和完成视图时读取和写入这些值。或者,如果你只想绑定到某些属性,只需将这些属性放在你的主视图模型上。

相关内容

  • 没有找到相关文章

最新更新