为了账号安全,请及时绑定邮箱和手机立即绑定

没有派生的 ViewModel 但行为相同?

没有派生的 ViewModel 但行为相同?

C#
红颜莎娜 2021-07-02 13:00:02
我正在编写一个小型 wpf 桌面应用程序。我的 BaseViewModel 看起来像这样:public abstract class BaseViewModel : INotifyPropertyChanged, IComparable<BaseViewModel>{    public abstract string GetDisplayText();    public abstract string GetImageName();    // INotifyPropertyChanged}我一直在为 mvvm 寻找最好的 paxis。大多数人说,一个模型有多个 ViewModel,我同意。因为我希望所有相同类型的 ViewModel 都以相同的方式处理基础知识,所以我认为它们应该相互派生。public abstract class BaseCustomerVm : BaseViewModel{    public abstract string Name { get; set; }    public abstract int Number { get; set; }    public abstract bool IsPerson { get; set; }    public override string GetDisplayText()    {        return Name;    }    public override string GetImageName()    {        if (IsPerson)            return "Person";        else            return "Company";    }}public class Customer1Vm : BaseCustomerVm{    public override string Name { get; set; }    public override int Number { get; set; }    public override bool IsPerson { get; set; }}为了实现这一点,我有以下选择:版本 1:public class Customer2Vm : BaseCustomerVm{    public override string Name { get; set; }    public override int Number { get; set; }    public override bool IsPerson { get; set; }    // Further Properties}版本 2:public class Customer2Vm : Customer1Vm{    // Further Properties}在我的搜索中,我读到 ViewModels 不应相互派生。这也在这篇文章中得到了回答。我的问题是:为什么我不应该以这种方式推导?在没有继承的情况下处理 sutch基础知识的正确方法是什么?
查看完整描述

2 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

继承不应该成为问题,直到您需要从多个(基本)视图模型继承,即,如果您有几个不同的基本视图模型,它们提供自己的公共基本功能。

由于您不能从 C# 中的多个类继承,因此您需要将通用功能分解为可重用的组件,您可以将这些组件注入到您的视图模型中。

但是,您能够直接绑定到类中定义的一些常见属性的唯一方法是使用继承,并且从不同的基本视图模型类链继承没有任何问题。事实上,根据我的经验,这是一种非常常见的方法。大多数在视图(使用的类型的ControlFrameworkElement等等)也做到这一点。


查看完整回答
反对 回复 2021-07-10
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

至于 ifCustomer2Vm应该从Customer1Vm; 我想你想要经典的继承问题:

Customer2Vm有“is-a”关系Customer1Vm吗?

只有你知道; 但根据名字我会怀疑它。在我看来,它们都应该源自BaseCustomerVm.

至于你是否应该使用继承可言; 我会说在这里基本上看起来还可以。如果你想避免它(并且更喜欢组合),我建议你让你的虚拟机实现一个ICustomerVm接口来获取属性;然后消费者将使用服务来获取显示文本和图像名称。我可能会坚持你所拥有的(假设它或多或少正是你所展示的)。


查看完整回答
反对 回复 2021-07-10
  • 2 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信