【问题标题】:Model And ViewModel Relations and Inheritance - how should be implemented?Model 和 ViewModel 的关系和继承——应该如何实现?
【发布时间】:2011-09-23 19:27:54
【问题描述】:

抱歉,问题的标题令人困惑。我不确定应该如何实现从基类派生的 ViewModel 和模型。

我的 ViewModel 类基于 ViewModelBase,ViewModelBase 包含一个 ModelBase,它用作所有其他模型的基类。

每个 ViewModel 都拥有一个“Model”属性,但是,因为 Model 属性由 ViewModel 基类定义为 ModelBase 类,所以我总是必须创建另一个将 Model 转换为的属性 - 从 ModelBase 到相关的 Model 类。

我的问题是 - 没有更简单的解决方案吗?是否有与这些问题相关的设计模式?

这是一个代码示例:

public abstract class BasicViewModel : ViewModelBase
{
    public BasicViewModel()
    {
    }
    public ModelBase Model { get; set; }
}

public class ModelBase
{
}

public class ContainableViewModel : BasicViewModel
{
    public ContainableViewModel(ContainableModel model)
    {
        this.Model = model;
    }

    public ContainableModel MyModel { get { return (ContainableModel)Model; } }

    public int Children { get { return MyModel.Children; } set { MyModel.Children = value; } }
}

public class ContainableModel : ModelBase
{
    public ContainableModel()
    {
        Children = 2;
    }

    public int Children { get; set; }
}

如您所见,“MyModel”属性是困扰我的属性。

非常感谢您的帮助和时间!

【问题讨论】:

  • ColinE 的答案只有在您不想为您的对象使用任何类型的基本集合时才有效。如果您想使用集合,您的原始代码似乎是最合适的答案。

标签: c# .net wpf mvvm viewmodel


【解决方案1】:

如果您的每个视图模型都包含一个模型属性,您可以使用泛型:

public abstract class BasicViewModel<TModelType> : ViewModelBase
    where TModelType : ModelBase
{
    public BasicViewModel(TModelType model)
    {
        Model = model;
    }

    public TModelType Model { get; set; }
}

public class ModelBase
{
}

您的可包含视图模型现在定义如下:

public class ContainableViewModel : BasicViewModel<ContainableModel>
{
    public ContainableViewModel(ContainableModel model)
        : base(model)
    {
    }

    // you can now omit this method, it is defined on the abstract superclass
    //public ContainableModel Model { get { return ()Model; } }

    public int Children { get { return MyModel.Children; } set { MyModel.Children = value; } }
}

public class ContainableModel : ModelBase
{
    public ContainableModel()
    {
        Children = 2;
    }

    public int Children { get; set; }
}

【讨论】:

  • 嘿,非常感谢!这是我的另一个解决方案——在处理更复杂的类时,它变得更加肮脏。谢谢
【解决方案2】:

我通常不会为不同的 Model 类型使用基类,因为 ViewModel 和 Model 对象之间通常没有一对一的对应关系。此外,模型对象通常没有太多共同点。这与 ViewModel 对象不同,后者都通过数据绑定绑定,因此可以受益于各种帮助方法,这些方法标准化了您绑定到 ViewModel 实例的方式。

Model-View-ViewModel 中的“模型”是一个提供业务逻辑和数据交互(与可视化和与用户交互无关的所有内容)的层。您的 CustomerWindow 的 CustomerViewModel 可能会使用来自您的模型层,但它很可能引用了您模型中的其他对象,例如某种存储库。其他视图,比如你的 MainWindow,可能有一个不直接对应于任何 Model 对象的 MainViewModel,但可能至少对你的 Model 有一些依赖项。

【讨论】:

  • 我们可以对此争论不休,但一些很多抽象模型可以被视为 List、SortedList、Queue、Tree 等,它们有一些共同点。也许这种抽象级别太多了,但是使用基本模型是可行的。我认为业务逻辑可能是单独的地方,域,存储库操作在这些模型上工作。这不只是数据存储。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多