2015-11-11 219 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更容易管理。你會發現你自己的風格和偏好。祝你好運! –