2011-06-27 135 views
1

对不起,问题的混淆标题。我不确定应该如何实现从基类派生的ViewModel和Model。模型和视图模型的关系和继承 - 应该如何实现?

我的ViewModel类基于ViewModelBase,ViewModelBase包含一个ModelBase,它作为所有其他模型的基类。但是,因为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

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

回答

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

嘿,非常感谢!这是我的另一个解决方案 - 当处理更复杂的类时,结果变得更加肮脏。 谢谢 – seren1ty

1

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

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

+0

我们可以争论不休,但是一些抽象模型可以被看作是List,SortedList,Queue,Tree等,它们有一些共同之处。也许这个抽象层次太多了,但是使用基本模型是可行的。我认为业务逻辑可能是独立的地方,即存储库操作在这些模型上工作的领域。哪些不超过数据存储。 –