我试图了解模型视图模型的关系和我保持同样的问题碰撞。 假设我们有一个“人”类只有一个字段:
public class Person
{
public string Name;
}
在下一阶段我有谁创建呈现个人用户控制我的XAML艺术家,并根据MVVM的做法,他需要涉及他看来VMPerson(视图模型人),所以现在我想补充另一个类:
public class VMPerson : INotifyPropertyChange
{
private Person person;
public VMPerson():this(new Person()){}
public VMPerson(Person person)
{
this.person = person;
}
public Name
{ get { return person.name; }
{ set { person.name = value; PropertyChange("Name"); }
}
所以,现在我几乎都设置..但如何将我的VM类涉及到我的模型类的变化? 如果我添加INotifyPropertyChanged的,并在模型中添加属性“名称”我endup非常相似,我的ViewModel类的额外层,我不需要的东西。 有什么办法让我的模型类,因为它是,但仍然可以在视图模型类里面的变化通知? 如果没有其他方式比使用INotifyPropertyChanged的机制或任何类似将在为什么我需要虚拟机的模型来实现? 它只是为少数聚集“模型”类为一类,将被投放到搜索的情况?
我想我一定会丢失在我的理解什么原因呢?据我描述了一个模型,同时使用视图代码隐藏作为控制器会比MVVM更好的抽象查看模式似乎给我,但我当然不知道这一点。 能向我解释的人,我缺少的是什么? 谢谢。
把视图模型代码到模型是不是最好的主意
的确,在许多情况下的ViewModels通过寻找类似的代码,真的不添加任何有价值的东西额外的层开始生活,但问题是,他们可以进化 。
虚拟机的作用是为视图提供便利 - INotifyPropertyChanged
是一个这样的便利,而模型的作用是封装业务逻辑 。 当你的代码的功能的增长会越来越丰富; 在某些时候,它甚至可能最终被在代码大小比模型大得多。 所以,区别是为了使便利性和业务逻辑部分彼此,这对你的代码的可维护性很好的效果保持很好地分离制成。
把视图模型代码到的观点是不是最好的主意
这里的原因是不同的:如果你这样做,然后需要使用视图模型与其他类型的视图,你将不得不重复所有的逻辑同步到其他视图的代码隐藏也是如此。 重复是坏的; 干好。
考虑到MVVM的一个非常重要的特点是,它提供的可测试性和可测性这必然意味着至少两种类型的视图(真钞和模拟),这种做法的必要性就不言而喻了。
该视图模型的一个目的是从模型中取数据,处理它必须将数据可视化的方式。
例如,在你的模型,你可以拥有的信息和出生日期要可视化的实际年龄。
在这种情况下,你应该做的处理(转换出生日期至实际年龄,像DateTime.Now.Year - DateOfBirth.Year)的视图模型。
在特定情况下,视图模型仅仅是从模型中的数据的包装(无处理)和appareantly没有必要对视图模型。
为了获得在视图模型模型的改变(即不需要在虚拟机处理性能),我通常执行INotifyPropertyChanged也模型。 这避免了大量的视图模型的包装性能。
在我的ViewModel我会有somethink像
_model.PropertyChanged += PropertyChangedEventHandler(OnPropertyChangedModel);
void OnPropertyChangedModel(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
OnPropertyChanged(e.PropertyName);
}
注意,在这种情况下,模型的属性被直接发送到视图(在视图模型没有处理)。
我看它的方式如下: - 视图模型,这就像主持人老MVP的方式,它将包含与加入各种业务功能(如IDealService和IStaticDataService的消费)。
我的模型是非常接近的DataModel简单地可叫做数据。
如果虚拟机有相关的位太多的数据,我通常将它们移动到模型,并使用它的情况下,从虚拟机。
即你可以有:
public class VMPerson : INotifyPropertyChange
{
public Person PersonItem {get; set;}
public VMPerson()
{
PersonItem = new Person();
}
}
你仍然可以得到人的姓名与您通过: {Binding PersonItem.Name}
我同意这将是很难说法定,如果你的原著Person类继承犯规INPC。