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

本文关键字:视图 模型 数据 运行时 设置 | 更新日期: 2023-09-27 18:29:14

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

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)技术。我不确定我们的团队是否已经准备好应对这种必须的复杂性。

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

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

编辑:绑定

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

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

然后使用ContentControl绑定到:

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