Можно ли подключить 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?