解释最好的办法是用例如这样:
这是模型
public class Person
{
public int age;
public string name;
}
这是视图模型
public class PersonVM
{
}
我的问题是:
应在VM揭露人的数据模板或封装用他自己的属性模型属性?
解释最好的办法是用例如这样:
这是模型
public class Person
{
public int age;
public string name;
}
这是视图模型
public class PersonVM
{
}
我的问题是:
应在VM揭露人的数据模板或封装用他自己的属性模型属性?
视图模型应该定义它自己的属性和隐藏从视图模型的细节。 这给了你最大的灵活性,并有助于保持视图模型型问题漏入模型类。 通常您的视图模型类封装了委托模型。 例如,
class PersonModel {
public string Name { get; set; }
}
class PersonViewModel {
private PersonModel Person { get; set;}
public string Name { get { return this.Person.Name; } }
public bool IsSelected { get; set; } // example of state exposed by view model
public PersonViewModel(PersonModel person) {
this.Person = person;
}
}
记住:模型不应该知道的是消费它的视图模型什么,视图模型不应该知道的是消费它认为任何东西。 视图应一无所知潜伏在后台的模特。 因此,在封装视图模型属性后面的模型。
没有关于这个问题的总协定。 例如,它是大约MVVM由Ward贝尔制定了开放的一个问题在这里 :
是VM允许提供在V展开的M-对象(例如,原员工)? 或者必须在M-对象的属性(如果它甚至允许有特性!)独占通过VM包装材料的表面暴露?
的不直接暴露在VM的模型的主要优点是:
你可以使用它作为一个“类固醇转换器”,在格式化的模型值的便捷的方式为视图
你可以注入与用户界面等的funcionality,如数据验证消息 , 撤消重做 ,..
该缺点是:
你将不得不重复大量的代码以暴露视图模型的所有车型性能。
如果您绑定控件到的ViewModels属性,您将发送从视图模型中的PropertyChanged事件。 但是,如果发生了什么,从其他来源的车型属性更改从视图模型制定者有什么不同? 然后它有那么你有2 OnPropertyChanged,一个模型,一个在视图模型...相当复杂结束通知视图模型!
所以对我来说,正确的答案是:这取决于你的需求。
这种情况的一个有趣的解决方案在MSDN第25卷,提出了由罗伯特·麦卡特。
http://msdn.microsoft.com/en-us/magazine/ff798279.aspx
他使用的动态视图模型在模型的顶部提供一个层,同时避免代理所有的模型属性的。
如果您的问题空间并不需要高性能(动态做招致性能损失),这是一个很好的解决方案。 该视图并不需要知道模型什么,但视图模型不必正在提供的代理属性“按原样”。 在任何时间属性可以被添加到视图模型,而无需修改视图或模型来包装模型属性。 阅读文章的更多细节。
有任何型号一个ViewModel能比这更糟糕。 如果你有什么模型的层次结构,甚至一个简单的集合? 在这种情况下,你必须通过所有车型迭代,并建立每个模型视图模型的实例,并且还注册通知变更事件或其他事件。 恕我直言,这完全是疯狂的,不合理的。 作为DaniCE说,你会用大量的代码而大伤脑筋结束。