2015-11-11 183 views
0

所以我在寻找https://github.com/xamarin/Sport作为我在当前项目中使用google搜索时遇到的一个例子。这与我正在进行的工作类似,因为我也使用了天蓝色的后端。MVVM Xamarin Forms Design

我有一个关于他们的mvvm布局的问题。我认为在mvvm模型是POCO排序,不应该实现INotifyPropertyChanged。 Arent在这种情况下既是模型又是ViewModel?看看运动员模型和AthleteViewModel。虚拟机拥有Athlete的属性,因此该模型也被用作虚拟机。

在我的项目中,如果我有相同的类型,我会有一个运动员模型,一个AthleteViewModel和一个AthletePageViewModel。 Athlete和AthleteVM将被自动映射。填充和/或创建运动员的唯一理由是坚持到服务或本地存储。

比其他方式更“正确”吗?或者我只是做错了,而且使它复杂化了?我几乎不想继续我这样做的方式,因为如果我只能使用一些虚拟机作为模型,我不想拥有一堆“额外”模型文件。

谢谢。

回答

3

为了实现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的主要概念在那里,那么它们大多是由开发人员的偏好决定的,他们是如何选择接近模式的实现的,这就是最重要的。

+0

哇,谢谢你的非常完整的答案。我很感激。当我继续我的项目时,我害怕的是进入方法2的缺点。它开始看起来像我的代码变得混乱,难以控制。在继续之前,我想看看我是否可以将它重构成更简单的东西。当我偶然发现Xamarin样本时,我认为他们的代码看起来非常干净并且容易遵循。所以,我以一种奇怪的方式倾向于重构更多的方法1方法,但不是出于懒惰哈哈。 – jmichas

+0

我同意,方法2是相当纯粹的方法,而方法1更容易管理。你会发现你自己的风格和偏好。祝你好运! –