很抱歉这个问题令人困惑。我不确定应该如何实现从基类派生的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”属性是让我烦恼的属性。
非常感谢你的帮助和时间!
答案 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有一些依赖。