Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在运行时设置视图/视图模型数据模板?_C#_.net_Wpf_Mvvm_Datatemplate - Fatal编程技术网

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

C# 如何在运行时设置视图/视图模型数据模板?,c#,.net,wpf,mvvm,datatemplate,C#,.net,Wpf,Mvvm,Datatemplate,这个MVVM的东西让我头疼。我有一个应用程序,在左窗格中有一个编辑器列表。右边是一个选项卡控件,其中将显示编辑器。我有一个主应用程序视图模型,其中包含一组视图模型。我将此集合称为工作区。这是从微软提供的MvvmDemoApp借用的 公共ObservableCollection工作区 { 得到 { ... } } 这些工作区绑定到主应用程序窗口中的选项卡控件,如下所示: <DataTemplate x:Key "WorkspacesTemplate"> <TabContro

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

公共ObservableCollection工作区
{
得到
{
...
}
}
这些工作区绑定到主应用程序窗口中的选项卡控件,如下所示:

<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)技术。我不确定我们的团队是否已经准备好进行这项复杂的工作。

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

编辑:绑定

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

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

你能详细说明一下吗?谁将绑定到数据模板属性?
<DataTemplate xmlns:vw="...">
  <vw:MessageLogView/>
</DataTemplate>
<ContentControl Content="{Binding ViewModel}"
                ContentTemplate="{Binding ViewModel.XamlTemplate}" />