Как подключить ViewModel к представлению, когда модель представления имеет параметры в конструкторе? - PullRequest
4 голосов
/ 21 января 2011

Я использую Prism и Unity для перезаписи приложения WPF с использованием шаблона MVVM.Большинство представлений подключаются к виртуальной машине через свойство DataContext, например:

<UserControl.DataContext>
    <VM:RibbonViewModel/>
</UserControl.DataContext>

Проблема в том, что этот метод не будет работать, если в конструкторе ViewModel есть параметр.

public RibbonViewModel(IEventAggregator eventAggregator)
{
    this.eventAggregator = eventAggregator;
}

Я получаю сообщение об ошибке:

Тип 'RibbonViewModel' не может использоваться как элемент объекта, поскольку он не является общедоступным или не определяет открытый конструктор без параметров или преобразователь типа.

Как подключить виртуальную машину к представлению, если там есть параметр?

Ответы [ 3 ]

5 голосов
/ 23 января 2011

Вы можете взглянуть на примеры приложений WPF Application Framework (WAF) .В этих примерах Контейнер IoC (в вашем случае это Unity) отвечает за создание ViewModels.Таким образом, ViewModel может иметь параметры конструктора.Контейнер IoC также отвечает за объединение View с ViewModel.Может быть, это вариант для вашего дизайна ViewModel.

2 голосов
/ 21 января 2011

Рассмотрите возможность использования ViewModelLocator.Вместо того, чтобы связывать текстовый текст с ViewModel в вашем случае выше, вы привязываетесь к локатору, который знает, как разрешить ViewModel из контейнера (unity), и в процессе вставляет любые зависимости в конструктор.В блоге публикуется краткое изложение реализации Джона Папа и Гленна Блока (одного из людей, стоящих за призмой).

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

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

.
1 голос
/ 21 января 2011

Я не использую единство или призму. Но почему вы не можете просто сделать это:

userControl.DataContext = ribbonViewModelInstance;

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

...