如何根据用户选择动态注入用户控件

时间:2011-05-27 18:13:56

标签: c# wpf mvvm user-controls

我的窗口上有一个TreeView控件,根据用户选择的选项应显示用户控件(确定要显示的用户控件是否完整)。我在弄清楚如何实际显示用户控件时遇到了问题。从本质上讲,用户可以从TreeView中选择项目,并根据用户控件的选择(在我假设的ContentControl控件中)。

目前,为了打开新窗口我有一个窗口适配器,我可以动态创建新窗口并设置父窗口。

如何在我的视图模型中完成此操作?

修改

这就是我相信Rachel在提到使用DataTemplate时所说的话。不要担心我的DataTemplates而是DataType属性。这只是我项目的名称。

<Window.Resources>
    <DataTemplate DataType="{x:Type DataTemplates:FooEditorViewModel}">
        <DataTemplates:FooControl></DataTemplates:FooControl>
    </DataTemplate>
    <DataTemplate DataType="{x:Type DataTemplates:BarEditorViewModel}">
        <DataTemplates:BarControl></DataTemplates:BarControl>
    </DataTemplate>
</Window.Resources>

这是一个示例视图模型。

public class ViewModel
{
    public IEditorViewModel Editor
    {
        get
        {
            return new BarEditorViewModel();
        }
    }
}

将所有这些粘在一起

<ContentControl Content="{Binding Editor}" />

我必须创建一个名为IEditorViewModel的空白界面,以便返回不同的用户控件编辑器。不确定是否有任何解决方法。

希望这有助于某人。

1 个答案:

答案 0 :(得分:5)

您的SelectedTreeViewItem将存储在您的ViewModel中,该值将用于确定要显示的项目。

一个例子是:

<ContentControl Content="{Binding SelectedItem}">
    <ContentControl.Style>
        <Style TargetType="{x:Type ContentControl}">
            <Setter Property="ContentTemplate" Value="{StaticResource DefaultTemplate}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding SelectedItem}" Value="{x:Type local:ItemA}">
                    <Setter Property="ContentTemplate" Value="{StaticResource TemplateA}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding SelectedItem}" Value="{x:Type local:ItemB}">
                    <Setter Property="ContentTemplate" Value="{StaticResource TemplateB}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

更好的选择是将DataTemplates用于不同的项目。然后,您只需设置Content="{Binding SelectedItem}",WPF将解析要使用的正确DataTemplate。我首先展示了上面的例子,因为它可以用来将你的模板基于SelectedItem的属性