。:应该虚拟机对象揭发M的对象是直接的,或只能通过干将委派到M的吸气?
-
12-09-2019 - |
题
最好的方式来解释是如此:
这是模型
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;
}
}
记住:模型不应该知道的是消费它的视图模型什么,视图模型不应该知道的是消费它认为任何东西。视图应一无所知潜伏在后台的模特。因此,封装属性后面的模型视图中的模型。
其他提示
没有一般性协议有关这个问题。例如,它是一个开放性问题有关。制订的病房钟 在这里,:
是VM允许提供的V一个 解开M-对象(例如,原 雇员)?或者必须M目的 性质(如果它甚至允许 具有的性质!) 被暴露 完全通过面的 VM包装?
主要的优点不能直接暴露模型在虚拟机是:
缺点是:
你会需要重复许多代码,以获得的所有模型的属性模型.
如果你绑的视图控制这个例子酒店,您将送引发事件的模型.但是会发生什么,如果该模型的属性变化,从其他来源不同的模型器?然后,它具有以通知的视图模型所以你最终有2OnPropertyChanged,一个在模型和一个在模型...相当复杂!
所以对我来说正确的答案是:这取决于你的需求。
在MSDN体积提出由Robert麦卡特对此的一个有趣的解决方案25.
http://msdn.microsoft.com/en-us/magazine/ ff798279.aspx
他使用动态视图模型对模型的顶部提供一个层,同时避免代理所有的模型的特性。
如果您的问题空间并不需要高性能(动态做招致性能损失),这是一个很好的解决方案。该视图并不需要知道模型什么,但视图模型不必正在提供的代理属性“按原样”。在任何时间属性可以被添加到视图模型,而无需修改视图或模型来包装模型属性。阅读文章的更多细节。
有一个视图模型对于任何型号能比这更糟糕。如果你有什么模型的层次结构,甚至一个简单的集合? 在这种情况下,你必须通过所有车型迭代,并建立每个模型视图模型的实例,并且还注册通知变更事件或其他事件。恕我直言,这完全是疯狂的,不合理的。作为DaniCE说,你会用大量的代码而大伤脑筋结束了。