【问题标题】:How do I set view/view model data template at runtime?如何在运行时设置视图/视图模型数据模板?
【发布时间】:2012-03-28 15:22:32
【问题描述】:

这个 MVVM 东西让我头疼。我有一个应用程序,它在左窗格中有一个编辑器列表。右侧是一个选项卡控件,其中将显示编辑器。我有一个包含视图模型集合的主应用程序视图模型。我将此集合称为工作区。这是借自微软提供的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) 技术。我不确定我们的团队是否已准备好应对这种必须成熟的技术。

【问题讨论】:

    标签: c# .net wpf mvvm datatemplate


    【解决方案1】:

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

    编辑:绑定

    你有你的视图模型列表。在每个视图模型(在基础视图模型类中)创建并公开此 XamlTemplate 属性。该属性应按照以下方式创建 Xaml:

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

    然后使用ContentControl绑定到:

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

    【讨论】:

    • 你能详细说明一下吗?谁将绑定到数据模板属性?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多