Подключение MVVM View и ViewModel с использованием декларативного контекста данных для времени разработки и шаблона данных для времени выполнения?

Можно ли подключить View и ViewModel с помощью декларативного контекста данных и шаблона данных?

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

Фон. Существует множество способов связать View и ViewModel, включая следующие:

A.) Декларативно укажите контекст данных модели представления в XAML представления. Этот метод полезен во время разработки с использованием конструктора без параметров для передачи фиктивных данных.

<UserControl.DataContext>
    <my: BrowseAssetsViewModel />
</UserControl.DataContext>

Б.) Программно укажите ViewModel, View и DataContext.

// …Setup code
BrowseAssetsViewModel viewModel = new BrowseAssetsViewModel(assetRegistry, domains);
BrowseAssetsView view = new BrowseAssetsView();
view.DataContext = viewModel;

Когда подход B используется в сочетании с подходом A, во время выполнения WPF переопределяет DataContext по умолчанию, указанный в подходе A, используя версию ViewModel с параметризованным конструктором, указанным в подходе B.

C.) Определите шаблон данных для ассоциации View-ViewModel. Связывая View и ViewModel в App.XAML Application.Resources, WPF может подключить правильный View на основе тип ViewModel.

<DataTemplate DataType="{x:Type vm: BrowseAssetsViewModel }">
    <vw: BrowseAssetsView />
</DataTemplate>

Если свойство ViewModel было привязано к элементу управления ContentPresenter, WPF подключит соответствующий View (на основе типа ViewModel) и поместит его в ContentPresenter. Это полезно в сценарии «ViewModel-first», где ViewModel представлен, а WPF разрешает и связывает правильный View, проверяя тип представленного ViewModel.

Проблема. При использовании этого подхода C в сочетании с подходом A WPF разрешает правильный View, но, кажется, затем повторно запрашивает View, вызывая декларативно заданную ViewModel через конструктор без параметров (подход A ), тем самым переопределив существующее свойство ViewModel!

Вопрос. Есть ли способ использовать эти методы (C и A) вместе, чтобы A случайно не перезаписал свойство ViewModel C?


person Lawrence P. Kelley    schedule 14.11.2011    source источник
comment
Зачем декларативно указывать DataContext ViewModel в XAML View, если вы не хотите, чтобы это объявление имело место?   -  person Eamonn McEvoy    schedule 15.11.2011
comment
Цель состоит в том, чтобы найти метод, который поддерживает как фиктивные модели ViewModels во время разработки (A), так и разрешение DataTemplate (C) во время выполнения.   -  person Lawrence P. Kelley    schedule 15.11.2011


Ответы (1)


Вы можете указать, что DataContext в случае A устанавливается только во время разработки, например:

<UserControl ...
    d:DataContext="{d:DesignInstance my:BrowseAssetsViewModel}"
>

Подробнее см. Использование DesignInstance ... в MSDN.

person Reed Copsey    schedule 14.11.2011
comment
Также добавьте IsDesignTimeCreatable = True, чтобы он отображался в VS. Например, d: DataContext = {d: DesignInstance Type = local: BrowseAssetsViewModel, IsDesignTimeCreatable = True}. - person Ed Lee; 15.11.2011
comment
Этот ответ в сочетании с IsDesignTimeCreatable = True, упомянутым в комментарии, решил проблему. Спасибо вам обоим. -Ларри - person Lawrence P. Kelley; 15.11.2011