【发布时间】:2019-05-07 13:29:31
【问题描述】:
我正在使用 Xceed.Wpf.AvalonDock 包(版本 3.5)中的 AvalonDock。对接管理器是我主要视图的一部分。有趣的部分在这里:
<xcad:DockingManager Name="_dockingManager" Grid.Row="1" DataContext="{Binding DockingManagerViewModel}"
DocumentsSource="{Binding Documents}"
AnchorablesSource="{Binding Anchorables}" >
<xcad:DockingManager.Resources>
<DataTemplate DataType="{x:Type vm:DockingWindowViewModel}">
<v:SampleDockWindowView />
</DataTemplate>
</xcad:DockingManager.Resources>
<xcad:DockingManager.LayoutItemContainerStyle>
<Style TargetType="{x:Type dockctrl:LayoutItem}" >
<Setter Property="Title" Value="{Binding Model.Title}" />
<Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}" />
<Setter Property="CanClose" Value="{Binding Model.CanClose}" />
</Style>
</xcad:DockingManager.LayoutItemContainerStyle>
</xcad:DockingManager>
所以主视图模型包含一个可观察的集合(例如“文档”),我可以在其中动态添加视图模型。现在的问题是我对不同的视图模型有不同的视图,并且视图将在运行时添加。目前,视图是根据数据模板检索的:
<xcad:DockingManager.Resources>
<DataTemplate DataType="{x:Type vm:DockingWindowViewModel}">
<v:SampleDockWindowView />
</DataTemplate>
</xcad:DockingManager.Resources>
如何更改此设置以获取基于相应视图模型的动态视图?
【问题讨论】:
-
您可以使用
DataTemplateSelector来实现更复杂的模板选择逻辑。 -
@BradleyUffner:这并没有什么帮助。我不想做一个复杂的选择我想添加一个动态视图。不知道我是否理解正确
-
“复杂”的意思是“比在 XAML 中可以静态完成的更多”。您希望从运行时动态提供的模板列表中确定要显示的模板。您可以在运行时构建
Dictionary<Type, DataTemplate>,用于将类型映射到模板,DataTemplateSelector可以只返回为该类型注册的模板。这允许您在运行时添加/删除模板。
标签: c# mvvm prism avalondock