如何在运行时设置视图/视图模型数据模板?

时间:2012-03-27 18:35:48

标签: c# .net wpf mvvm datatemplate

这个MVVM的东西让我头疼。我有一个应用程序,它在左窗格中有一个编辑器列表。右侧是一个选项卡控件,将显示编辑器。我有一个主应用程序视图模型,其中包含一组视图模型。我将此集合称为Workspaces。这是借用Microsoft提供的MvvmDemoApp here

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}"/>     

视图模型使用DataTemplates绑定到视图,如下所示:

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

这很好用。但是,现在我需要使应用程序可配置,从配置文件中读取编辑器列表。我想这个配置文件将包含每个编辑器的视图和视图模型组件。但是,如何将两者绑定在一起,以便当某人绑定到视图模型(或视图模型的集合)时,会显示正确的视图(类似于DataTemplate所做的但是在代码中,而不是XAML)?

我正试图远离控制反转(IoC)技术。我不确定我们的团队是否已准备好进行必须的复杂化。

1 个答案:

答案 0 :(得分:1)

IoC是完美的解决方案,但如果没有此选项,您可以使用XmlWriter在视图模型中创建XAML数据模板,并将其作为要绑定的属性公开。

编辑:绑定

您有视图模型列表。在每个视图模型中(在基础视图模型类中)创建并公开此XamlTemplate属性。该属性应该创建Xaml:

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

然后使用ContentControl绑定到:

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