2012-03-27 48 views
0

这个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

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

编辑:绑定

你有你的视图模型的列表。在每个视图模型中(在基本视图模型类中)创建并公开此XamlTemplate属性。该物业应的线沿线的创建XAML中:

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

然后用ContentControl绑定到:

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

你能否解释一下?谁将绑定到数据模板属性? – bsh152s 2012-03-27 21:58:27

+0

@ bsh152s:希望编辑给你更多的指针。 – 2012-03-28 07:23:02