我的窗口上有一个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
的空白界面,以便返回不同的用户控件编辑器。不确定是否有任何解决方法。
希望这有助于某人。
答案 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的属性