Подтвердить что ты не робот

MVVM - привязать непосредственно к объекту модели, открытому из виртуальной машины или реализовать отдельное свойство в виртуальной машине для доступа к свойствам модели

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

Я использую WPF, Entity Framework и MVVM.

В настоящее время в моей модели ViewModel у меня есть свойство

public Model.Document Document {get;set;} //Model.Document is an EF Entity

Затем в XAML я привязываюсь к

<TextBox Text={Binding Path=Document.Title}/>

Заголовок, конечно, является свойством Model.

Теперь мне пришел следующий вопрос: Чтобы отделить модель от представления, было бы лучше, если бы я добавил свойство ViewModel, например,

    public string Title
    {
        get { return Document.Title; }
        set { Document.Title = value; }
    }

а затем выполните следующие действия:

<TextBox Text={Binding Path=Title}/>

Какой способ рекомендуется?

4b9b3361

Ответ 1

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

Является ли Model.Document интерфейсом INotifyPropertyChanged? Если нет, я бы рекомендовал добавить свойство Title в вашу модель представления и реализовать INotifyPropertyChanged в вашей модели представлений, чтобы при изменении заголовка PropertyChanged, чтобы уведомить представление. >

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

Ответ 2

Последний - лучший способ сделать это, по крайней мере, ИМО. На самом деле, я не видел другого. Модель viewmodel служит посредником между представлением и моделью, поэтому эти два не должны действительно знать друг друга.

Вот простой пример .

Ответ 3

Это действительно зависит от вашей ситуации. В прямом смысле View должен взаимодействовать только с View Model. Но оба подхода выше имеют свои преимущества.

Предоставляя свойство Document, вам не нужно дублировать все свойства, необходимые для доступа к нему. Поэтому, если у вас есть множество свойств или вы используете какое-то отражение (например, отображение документа в PropertyGrid), то этот способ, вероятно, лучше.

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

Ответ 4

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

Это две действительно важные квалификации. Чтение/запись привязки к свойствам модели настолько чревато потенциальными проблемами, что вместо того, чтобы трезво проанализировать ситуацию, чтобы увидеть, является ли это одним из случаев, когда этого не происходит, я бы просто реализовал свойство в модели представления и сделаю с этим. И если моя модель не поддерживает уведомление об изменении, если мне это нужно, что я, вероятно, сделаю, мне нужно будет реализовать его в модели представления.

Ответ 5

Возможно, вы посмотрите на пример BookLibrary приложения WPF Application Framework (WAF). Он использует первый подход и все еще следует шаблону MVVM (разделение проблем, единичное тестирование).

Это упрощает ViewModels, потому что Binding использует реализацию Entity объектов INotifyPropertyChanged. В противном случае вы должны синхронизировать изменения вручную между ViewModels.