Зависимости MVVM между View и ViewModel - PullRequest
2 голосов
/ 23 апреля 2009

В настоящее время существует много вариантов шаблона проектирования MVVM, но, насколько я понимаю, представлению разрешено иметь зависимости от модели представления. Мой коллега не согласен, но не может дать удовлетворительное объяснение.

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

Можно ли иметь эту зависимость? Какие недостатки?

Ответы [ 2 ]

7 голосов
/ 23 апреля 2009

Основная метрика: Вы можете проверить это ?

Представление абсолютно нуждается в ссылке на модель представления. Как еще он может получить информацию, необходимую для отображения? Обычно достаточно иметь модель представления в DataContext представления, но это все еще составляет зависимость. Без виртуальной машины в DataContext представление было бы бесполезным.

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

public MyViewModel ViewModel
{
    get { return DataContext as MyViewModel; }
}

private void _someEventHandler(object sender, EventArgs )
{
    ViewModel.SomeMethod();
}

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

Если виртуальной машине нужно каким-то образом взаимодействовать с представлением, вы можете абстрагировать требования в интерфейс и заставить представление реализовать этот интерфейс. Затем, когда представление загружается, оно может предоставить ВМ ссылку на себя, с которой ВМ может взаимодействовать.

1 голос
/ 23 апреля 2009

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

Я думаю, для представления хорошей идеей является попытка привести свой DataContext (обычно внутри события DataContextChanged) к нужному типу интерфейса. Таким образом, представление все еще может быть инициализировано с помощью шаблонов данных и другого XAML. Если вы заставляете интерфейс передаваться в конструкторе, вы должны создать представление в коде.

...