这个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)技术。我不确定我们的团队是否已准备好进行必须的复杂化。
答案 0 :(得分:1)
IoC是完美的解决方案,但如果没有此选项,您可以使用XmlWriter在视图模型中创建XAML数据模板,并将其作为要绑定的属性公开。
编辑:绑定
您有视图模型列表。在每个视图模型中(在基础视图模型类中)创建并公开此XamlTemplate属性。该属性应该创建Xaml:
<DataTemplate xmlns:vw="...">
<vw:MessageLogView/>
</DataTemplate>
然后使用ContentControl
绑定到:
<ContentControl Content="{Binding ViewModel}"
ContentTemplate="{Binding ViewModel.XamlTemplate}" />