为了实现MVVM设计模式,您不需要遵循严格规则的最终主集合。实际上,这些指导方针一般都是模糊。
从我所看到的,有几种不同的方法可以将模型暴露给视图。它们是:
方法1 - INotifyPropertyChanged的示范
public class Car : INotifyPropertyChanged
{
private string _Model;
public string Model
{
get { return _Model; }
set
{
_Model = value;
NotifyOfPropertyChange();
}
}
...
}
public class CarViewModel
{
//The entire model is exposed to the view.
public Car Model { get; set; }
...
方法2 - INotifyPropertyChanged的在视图模型
public class CarViewModel
{
private Car _Car;
//The model property is exposed to the view, not the model itself.
public string CarModel
{
get { return _Car.Model; }
set
{
_Car.Model = value;
NotifyOfPropertyChange();
}
}
...
在方面优选方法,我会说方法2是更好的选择。为什么?
- Model对象不会暴露给视图。
- 视图模型仅公开视图需要的内容。
方法2有其缺点。想象一下,如果您需要暴露批次的模型属性,或者想象一下,如果您的模型发生变化,那么更容易在模型中简单实现INotifyPropertyChanged
并将其暴露给视图。程序员本质上是懒惰的,因此为了节省麻烦,你会看到方法1和方法2一样多。
但是那不是是坏事。
是否比其他方式更“正确”?或者我只是做错了,而且使它复杂化了?
请记住,MVVM设计模式只是一种模式。这两个选项都不是正确的,只要MVVM的主要概念在那里,那么它们大多是由开发人员的偏好决定的,他们是如何选择接近模式的实现的,这就是最重要的。
哇,谢谢你的非常完整的答案。我很感激。当我继续我的项目时,我害怕的是进入方法2的缺点。它开始看起来像我的代码变得混乱,难以控制。在继续之前,我想看看我是否可以将它重构成更简单的东西。当我偶然发现Xamarin样本时,我认为他们的代码看起来非常干净并且容易遵循。所以,我以一种奇怪的方式倾向于重构更多的方法1方法,但不是出于懒惰哈哈。 – jmichas
我同意,方法2是相当纯粹的方法,而方法1更容易管理。你会发现你自己的风格和偏好。祝你好运! –