模型和ViewModel关系和继承 - 应该如何实现?

时间:2011-06-27 20:10:55

标签: c# .net wpf mvvm viewmodel

很抱歉这个问题令人困惑。我不确定应该如何实现从基类派生的ViewModel和Models。

我的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”属性是让我烦恼的属性。

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

2 个答案:

答案 0 :(得分:2)

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

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; }
}

答案 1 :(得分:1)

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

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