2015-11-11 2 views
0

Итак, я смотрел на https://github.com/xamarin/Sport как пример, который я натолкнулся на то, что придумал что-то для моего текущего проекта. Это похоже на то, на что я работаю, потому что я использую лазурный бэкэнд.MVVM Xamarin Forms Design

У меня вопрос о их расположении mvvm. Я думал, что в mvvm модели были своего рода POCOs и не предполагали реализовать INotifyPropertyChanged. Арент они действуют как модель и ViewModel в этом случае? Посмотрите на модель Athlete и AthleteViewModel. У VM есть свойство для Athlete, и поэтому модель также используется как виртуальная машина.

В моем проекте, если бы у меня были те же типы, у меня была бы модель Athlete, AthleteViewModel и AthletePageViewModel. Если спортсмен и спортсменVM будут автоматически удалены. Единственной причиной для заполнения и создания спортсмена является сохранение его в службе или локальном хранилище.

Является ли один способ более «правильным», чем другим? Или я просто делаю это неправильно и усложняю? Я почти не хочу продолжать то, как я это делаю, потому что я не хочу иметь кучу «лишних» файлов моделей, если я могу просто использовать некоторые из моих виртуальных машин в качестве моделей.

Спасибо.

ответ

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 не открыт для просмотра.
  • Модель View только предоставляет то, что требуется View.

Способ 2 имеет свои недостатки. Представьте себе, если вам нужно разоблачить лотов свойств модели, или представьте, если ваша модель изменится, это, конечно, проще, чтобы просто реализовать INotifyPropertyChanged в модели и выставить ее на вид. Программисты ленивы по своей природе, поэтому для того, чтобы избавиться от хлопот, вы увидите метод 1 точно так же, как метод 2.

Но это не Плохая вещь.

Является ли один способ более «правильным», чем другим? Или я просто делаю это неправильно и усложняю?

Помните, что шаблон проектирования MVVM - это всего лишь шаблон.Ни один из вариантов не соответствует . В основном, разработчики предпочитают, как они выбирают подход к реализации шаблона, если существуют основные концепции MVVM, это все, что имеет значение.

+0

Ничего себе, спасибо за самый полный ответ. Я ценю это. Чего я боялся, когда я продолжал свой проект, бегало в сторону понижения для метода 2. Поначалу казалось, что мой код становится грязным и трудно контролировать. Прежде чем я продолжил, я хотел посмотреть, смогу ли я переработать его в нечто более простое. Когда я наткнулся на образец xamarin, я подумал, что их код выглядит очень чистым и легким для подражания. Итак, странным образом Im склоняется к рефакторингу больше к методу 1 подхода, но не к лени. – jmichas

+0

Согласен, метод 2 довольно пуристский подход, тогда как метод 1 проще управлять. Вы найдете свой собственный стиль и предпочтения, когда будете продолжать. Удачи! –