EF4 + MVVM - Выставлять сущности во ViewModel? - PullRequest
6 голосов
/ 10 ноября 2010

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

Итак, мой вопрос: должна ли ViewModel отделить модель от вида? Другими словами, это нормально, выставлять сущности EntityFramework в View через ViewModel? Например, скажем, в представлении есть поле со списком, где пользователь может выбрать состояние для адреса. В AddressViewModel должен ли State быть представлен как реальное свойство типа объекта или он должен быть представлен как StateViewModel? Если это должно быть свойство типа StateviewModel, я не понимаю, как следует управлять базовой моделью в установщике AddressViewModel.State (потому что в свойстве задается StateViewModel, а не объект State).

Мне кажется, что это может пойти в любом случае, но кажется более последовательным, чтобы никогда не показывать модель непосредственно представлению. Мысли? * * 1005

Ответы [ 4 ]

4 голосов
/ 10 ноября 2010

Вы должны стремиться полностью отделить вашу модель от вашего взгляда, это должна быть цель, вы можете ее достичь или не можете, но все же это должно быть вашей целью.

В частности, ваш вопрос касаетсясписок констант (более или менее), что является простым случаем.Поправьте меня, если я ошибаюсь, но у вас, вероятно, есть таблица States с code и name для каждого состояния, а затем у вас есть другая таблица с внешним ключом для первого.

В этом сценарии лучше всего загрузить и создать список StateViewModel один раз во время инициализации приложения, а затем иметь дело со значением внешнего ключа (состояние code как бы) во всем приложении вместо StateViewModelсами объектыСвойства, которые вы должны использовать: SelectedValue и SelectedValuePath из ComboBox, пример:

<ComboBox ItemsSource="{x:Static StateViewModel.StaticList}"
          SelectedValue="{Binding StateForeignKey}"
          SelectedValuePath="code"
          DisplayMemberPath="name" />

Это заполнит ComboBox объектами StateViewModel (которые были созданы с использованием-disposed context), но передаст свойство code выбранного элемента в связанное поле StateForeignKey, кроме того, ComboBox отобразит свойство name, чтобы его можно было читать человеку.

2 голосов
/ 10 ноября 2010

Цель модели представления состоит в том, чтобы отделить представление от модели данных.Если в представлении, связанном с моделью данных, нет функциональности, модель представления не требуется.

Если в модели данных имеется объект, свойства которого не изменяются после его создания, и что представление не будет изменяться, и это можно представить в пользовательском интерфейсе без форматирования или преобразования, тогдане связывает какую-либо его функциональность с представлением, выставляя это непосредственно.Для этого вам не нужна модель представления.

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

1 голос
/ 11 ноября 2010

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

0 голосов
/ 11 ноября 2010

Причина, по которой вы не можете открыть Entity в ViewModel, заключается в том, что вы не должны загрязнять Entity конкретным кодом вида , таким как IDataErrorInfo, INotifyPropertyChanged, IEditableObject и т. Д.

Entity является ядром приложенияи должен быть POCO, может быть повторно использован в любом типе приложения.Например, если вы разрабатываете приложение, доступное через Mobile, Web и Desktop, вам не нужно создавать Entity для каждого типа приложений.

причина разъединения?извините, но я не согласен, потому что я не вижу никакой пользы от развязки Model и ViewModel, потому что модульный тест будет хорошо работать с или без Entity внутри ViewModel.

UPDATE

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

...