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

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

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

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

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

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

B.) Программно указать 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.) Определите a Шаблон данных для ассоциации 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?

6
задан Lawrence P. Kelley 15 November 2011 в 14:23
поделиться