Рассмотрение проекта MVVM - PullRequest
1 голос
/ 03 февраля 2011

В настоящее время я занимаюсь разработкой нового приложения WPF, и большая часть моего уровня бизнес-логики разработана (т.е. мои модели).

Я собираюсь реализовать классы ViewModel для представления одной функции моего приложения. Я совершенно новичок в модели Model-View-ViewModel, и у меня возник вопрос, какой подход лучше всего использовать при реализации моих классов ViewModel.

Из примеров в Интернете я обнаружил, что Модель часто является членом ViewModel. Используя этот подход, ViewModel предоставляет свойства члена-модели, чтобы их можно было связать с моделью в представлении.

Например:

Public Class MyViewModel
  Implements INotifyPropertyChanged

  Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

  Private _myModel As ModelClass

  Public Property MyModelPropertyA As Object
    Get
      Return _myModel.MyModelPropertyA
    End Get
    Set(ByVal value As Object)
      _myModel.MyModelPropertyA = value
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("MyModelPropertyA")
    End Set
  Public Property MyModelPropertyB As Object
    Get
      Return _myModel.MyModelPropertyB
    End Get
    Set(ByVal value As Object)
      _myModel.MyModelPropertyB = value
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("MyModelPropertyB")
    End Set
    '.... And so On'

End Class

Что мне не нравится в этом подходе, так это тот факт, что есть много свойств, которые я буду переписывать.

Итак, я рассматриваю вариант наследования класса модели во ViewModel вместо использования закрытого члена.

Как и так:

Public Class MyViewModel
      Inherits MyModel
      Implements INotifyPropertyChanged

      Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

      'Now all of my properties are inherited'
End Class

Проблема второго подхода заключается в том, что я не уверен, как преобразовать мои модели в модели представлений во время работы приложения.

Вы не можете установить viewModelInstance = ModelInstance.

(но вы можете установить modelInstance = viewModelInstance)

Я ищу совет относительно лучшего подхода к реализации классов ViewModel.

Ответы [ 3 ]

3 голосов
/ 03 февраля 2011

Даже не думайте о наследовании вашей модели представления от модели - это будет хак, который никому не понравится.Если вы слишком ленивы, выставляете все свойства (BTW resharper может сделать это автоматически), тогда вы можете включить вашу модель в вашу viewModel и предоставить доступ к ней через какое-то свойство readonly.Но вы все равно должны реализовать INotifyPropertyChanged в классе модели.

Некоторый код (извините за C #):

class Model : INotifyPropertyChanged
{
    public string Name { get; set; } // this raises PropertyChanged
}

class ViewModel
{
    private readonly Model _model;

    public Model Model { get { return _model; } }
}

Просмотр XAML:

<Textbox Text="{Binding Model.Name}" />
1 голос
/ 03 февраля 2011

Ознакомьтесь с этой диаграммой, взятой из здесь .

enter image description here

Это отличная диаграмма, на которую можно ссылаться, чтобы убедиться, что вы правильно следуете шаблону,Как вы можете видеть, существуют разные способы взаимодействия между слоями, но главное - это разделение.Всегда проверяйте, чтобы каждый слой знал только о своем родительском слое, а не о его дочерних элементах, т. Е. VM знает о модели, но не о представлении, а модель знает о бизнес-уровне, а не о модели или представлении представления.

Как видно из стрелок (и, как уже упоминалось, другие), модель можно «выставить через одно свойство в модели представления», что означает, что представление затем имеет прямую ссылку на модель через это, илиМодель может быть «Абстрагирована или повторно реализована в Свойствах модели» на виртуальной машине.

1 голос
/ 03 февраля 2011

Модель представления обычно заключает в оболочку / инкапсулирует логику, относящуюся к представлению.Использование ViewModel для простого прохождения данных модели не требуется, IMHO.Хотя пуристический подход заключается в определении ViewModel и передаче этих данных;при определенных обстоятельствах это просто не нужно, поскольку приложение носит упрощенный характер.Если приложение имеет любой потенциал роста, тогда использование ViewModel было бы необходимо.

Если у вас была Person модель;ViewModel обычно может содержать свойство, которое предоставляет ObservableCollection<Person>, называемое People.ViewModel является оркестратором для View;не пропуск для Модели.

Однако вы не должны привязывать свою Модель к ViewModel по причинам, указанным выше, поскольку они должны быть отделены друг от друга в теории и на практике.

...