Как настроить просмотр / просмотр шаблона данных модели во время выполнения? - PullRequest
0 голосов
/ 27 марта 2012

Этот материал MVVM делает мою голову болит. У меня есть приложение, которое имеет список редакторов в левой панели. Справа находится вкладка управления, где будут отображаться редакторы. У меня есть основная модель представления приложения, которая содержит коллекцию моделей представления. Я называю эту коллекцию Workspaces. Это заимствовано из MvvmDemoApp, который Microsoft предоставляет здесь .

public ObservableCollection<WorkspaceViewModel> Workspaces
{
  get
  {
    ...
  }
}

Эти рабочие пространства связаны с элементом управления вкладкой в ​​главном окне приложения следующим образом:

<DataTemplate x:Key "WorkspacesTemplate">
  <TabControl
     IsSynchonizedWithCurrentItem="True"
     ItemSource="{Binding Workspaces}"
     SelectedItem="{Binding ActiveWorkspace}"/>
</DataTemplate>
...
<ContentControl
  Content="{Binding}"
  ContentTemplate="{StaticResource WorkspacesTemplate}"/>     

Модели представлений привязаны к представлению с использованием шаблонов данных, например:

<DataTemplate DataType="{x:Type vm:MessageLogViewModel}">
  <vw:MessageLogView/>
</DataTemplate>

Это отлично работает. Однако теперь мне нужно настроить приложение так, чтобы список редакторов читался из файла конфигурации. Я предполагаю, что этот файл конфигурации будет содержать компоненты вида и вида для каждого редактора. Но как мне связать их вместе, чтобы, когда кто-то связывался с моделью представления (или набором моделей представления), отображалось правильное представление (аналогично тому, что делает DataTemplate, но в коде, а не в XAML)?

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

1 Ответ

1 голос
/ 28 марта 2012

IoC является идеальным решением для этого, однако без этой опции вы можете создать шаблон данных XAML в модели представления с помощью XmlWriter и выставить его как свойство для привязки.

Редактировать: Привязки

У вас есть список моделей просмотра. Создайте и предоставьте это свойство XamlTemplate в каждой модели представления (в классе модели базового представления). Свойство должно создать Xaml в соответствии с:

<DataTemplate xmlns:vw="...">
  <vw:MessageLogView/>
</DataTemplate>

Затем используйте ContentControl для привязки к:

<ContentControl Content="{Binding ViewModel}"
                ContentTemplate="{Binding ViewModel.XamlTemplate}" />
...