MVVM ( МВВМ ):Должен ли объект виртуальной машины предоставлять доступ к объекту M напрямую или только через геттеры, делегирующие его геттерам M?

StackOverflow https://stackoverflow.com/questions/1114555

Вопрос

лучший способ объяснить это на примере so:

это и есть модель

public class Person 
{
    public int age;
    public string name;
}

это модель представления

public class PersonVM
{    
}

мой вопрос заключается в следующем:
должна ли виртуальная машина предоставлять пользователю доступ к шаблону данных или инкапсулировать свойства модели с его собственными свойствами?

Это было полезно?

Решение

Модель представления должна объявлять свои собственные свойства и скрывать специфику модели от представления.Это дает вам максимальную гибкость и помогает предотвратить утечку проблем, связанных с типом модели представления, в классы моделей.Обычно ваши классы модели представления инкапсулируют модель путем делегирования.Например,

class PersonModel {
    public string Name { get; set; }
}

class PersonViewModel {
    private PersonModel Person { get; set;}
    public string Name { get { return this.Person.Name; } }
    public bool IsSelected { get; set; } // example of state exposed by view model

    public PersonViewModel(PersonModel person) {
        this.Person = person;
    }
}

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

Другие советы

По этому вопросу нет общего согласия.Например, это был один из открытых вопросов о MVVM, сформулированный Уордом Беллом здесь:

Разрешено ли виртуальной машине предлагать V развернутый M-объект (например, необработанный Employee) ?Или должны быть доступны свойства M-объекта (если им вообще разрешено иметь свойства!) исключительно через поверхность оболочки виртуальной машины ?

Основными преимуществами отсутствия прямого отображения Модели в виртуальной машине являются:

  • вы можете использовать его как "конвертер на стероидах", формируя значения модели удобным для просмотра способом

  • вы можете ввести другие функции, связанные с пользовательским интерфейсом, например сообщения о проверке данных, отменить повтор,..

Минусы заключаются в следующем:

  • вам придется продублировать много кода, чтобы предоставить доступ ко всем свойствам моделей в viewmodel.

  • если вы привяжете элемент управления view к свойству viewmodels, вы будете отправлять события PropertyChanged из viewmodel.Но что произойдет, если свойство models изменится из другого источника, отличного от установщика viewmodel?Затем он должен уведомить viewmodel, чтобы вы получили 2 OnPropertyChanged, один в модели и один в viewmodel...довольно сложный!

Так что для меня правильный ответ таков:это зависит от ваших требований.

Интересное решение этой проблемы было предложено Робертом Маккартером в томе 25 MSDN.

http://msdn.microsoft.com/en-us/magazine/ff798279.aspx

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

Если ваше проблемное пространство не требует высокой производительности (динамика действительно снижает производительность), это отличное решение.Представлению не нужно ничего знать о Модели, но Модель Представления не обязана передавать свойства прокси, которые предоставляются "как есть". В любой момент свойства могут быть добавлены к модели представления, чтобы обернуть свойства модели без изменения представления или Модели.Прочтите статью для получения более подробной информации.

Наличие ViewModel для любой модели может быть еще хуже, чем это.Что, если у вас есть иерархическая структура Модели или даже простая коллекция?В этом случае вам придется выполнить итерацию по всем моделям и создать экземпляр ViewModel для каждой модели, а также зарегистрировать события уведомления об изменении или другие события.ИМХО, это совершенно безумно и неразумно.Как сказала Дэнис, в итоге у вас будет много кода и большая головная боль.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top