Соедините MVVM View и ViewModel, используя декларативный DataContext для времени разработки и Шаблон данных для времени выполнения? - PullRequest
6 голосов
/ 15 ноября 2011

Можно ли соединить View и ViewModel, используя декларативный DataContext и шаблон данных?

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

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

A.) Декларативно укажите ViewModel DataContext в 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.) Определить шаблон данных для ассоциации 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 разрешает корректное представление, но, кажется, затем повторно запрашивает представление, вызывая декларативно указанную ViewModel через конструктор без параметров (подход A), переопределяя существующее свойство ViewModel!

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

1 Ответ

8 голосов
/ 15 ноября 2011

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

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

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

...