AvalonDock 文档视图内容在浮动后消失 window
AvalonDock document view content disapear after float window
我在我的项目中使用 AvalonDock 控件。当我将文档移动到任何地方并脱离控制时,文档内容就会消失。如果我将文档重新停靠到控件,文档内容就会出来。我确定我错过了一些如此简单的东西,但我不明白这个问题。这是 MainView 中的代码片段;
<xcad:DockingManager AllowMixedOrientation="True" DocumentsSource="{Binding DocumentViewModels}">
<xcad:DockingManager.Resources>
<DataTemplate DataType="{x:Type viewModels:WatchListViewModel}">
<local:WatchListView DataContext="{Binding}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:ScanListViewModel}">
<local:ScanListView DataContext="{Binding}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:SignalListViewModel}">
<local:SignalListView DataContext="{Binding}"/>
</DataTemplate>
</xcad:DockingManager.Resources>
<xcad:DockingManager.LayoutItemContainerStyle>
<Style TargetType="{x:Type xcad:LayoutItem}">
<Setter Property="Title" Value="{Binding Model.Document.Title}"/>
</Style>
</xcad:DockingManager.LayoutItemContainerStyle>
</xcad:DockingManager>
为了澄清问题想分享三个截图。第一个屏幕截图显示了移动到任何地方之前的文档。第二个屏幕截图显示移动到任何地方(浮动)后的文档。第三张截图显示重新停靠到同一个地方。其实第一张和第三张图是一样的,但我想清楚地表明实际内容仍然存在。
您需要在您的代码中添加一个 DataTemplateSelector
,以便告知 AvalonDock 哪个 DataTemplate 用于您自己的 View/ViewModel。
为此,您需要定义一个新的 class,如下所示:
class PanesTemplateSelector : System.Windows.Controls.DataTemplateSelector
{
public DataTemplate WatchListViewTemplate { get; set; }
public DataTemplate ScanListViewTemplate { get; set; }
public DataTemplate SignalListViewTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is WatchListViewModel)
return WatchListViewTemplate;
if (item is ScanListViewModel)
return ScanListViewTemplate;
if (item is SignalListViewModel)
return SignalListViewTemplate;
return base.SelectTemplate(item, container);
}
}
然后你需要添加这个 class 你的 XAML 如下:
<xcad:DockingManager.LayoutItemTemplateSelector>
<s:PanesTemplateSelector>
<s:PanesTemplateSelector.WatchListViewTemplate>
<DataTemplate>
<p:WatchListView />
</DataTemplate>
</s:PanesTemplateSelector.WatchListViewTemplate>
<s:PanesTemplateSelector.ScanListViewTemplate>
<DataTemplate>
<p:ScanListView />
</DataTemplate>
</s:PanesTemplateSelector.ScanListViewTemplate>
<s:PanesTemplateSelector.SignalListViewTemplate>
<DataTemplate>
<p:SignalListView />
</DataTemplate>
</s:PanesTemplateSelector.SignalListViewTemplate>
</s:PanesTemplateSelector>
</xcad:DockingManager.LayoutItemTemplateSelector>
其中 s
链接到您定义的名称空间,PanesTemplateSelector
和 p
链接到您定义自己的视图的名称空间
我在我的项目中使用 AvalonDock 控件。当我将文档移动到任何地方并脱离控制时,文档内容就会消失。如果我将文档重新停靠到控件,文档内容就会出来。我确定我错过了一些如此简单的东西,但我不明白这个问题。这是 MainView 中的代码片段;
<xcad:DockingManager AllowMixedOrientation="True" DocumentsSource="{Binding DocumentViewModels}">
<xcad:DockingManager.Resources>
<DataTemplate DataType="{x:Type viewModels:WatchListViewModel}">
<local:WatchListView DataContext="{Binding}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:ScanListViewModel}">
<local:ScanListView DataContext="{Binding}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:SignalListViewModel}">
<local:SignalListView DataContext="{Binding}"/>
</DataTemplate>
</xcad:DockingManager.Resources>
<xcad:DockingManager.LayoutItemContainerStyle>
<Style TargetType="{x:Type xcad:LayoutItem}">
<Setter Property="Title" Value="{Binding Model.Document.Title}"/>
</Style>
</xcad:DockingManager.LayoutItemContainerStyle>
</xcad:DockingManager>
为了澄清问题想分享三个截图。第一个屏幕截图显示了移动到任何地方之前的文档。第二个屏幕截图显示移动到任何地方(浮动)后的文档。第三张截图显示重新停靠到同一个地方。其实第一张和第三张图是一样的,但我想清楚地表明实际内容仍然存在。
您需要在您的代码中添加一个 DataTemplateSelector
,以便告知 AvalonDock 哪个 DataTemplate 用于您自己的 View/ViewModel。
为此,您需要定义一个新的 class,如下所示:
class PanesTemplateSelector : System.Windows.Controls.DataTemplateSelector
{
public DataTemplate WatchListViewTemplate { get; set; }
public DataTemplate ScanListViewTemplate { get; set; }
public DataTemplate SignalListViewTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is WatchListViewModel)
return WatchListViewTemplate;
if (item is ScanListViewModel)
return ScanListViewTemplate;
if (item is SignalListViewModel)
return SignalListViewTemplate;
return base.SelectTemplate(item, container);
}
}
然后你需要添加这个 class 你的 XAML 如下:
<xcad:DockingManager.LayoutItemTemplateSelector>
<s:PanesTemplateSelector>
<s:PanesTemplateSelector.WatchListViewTemplate>
<DataTemplate>
<p:WatchListView />
</DataTemplate>
</s:PanesTemplateSelector.WatchListViewTemplate>
<s:PanesTemplateSelector.ScanListViewTemplate>
<DataTemplate>
<p:ScanListView />
</DataTemplate>
</s:PanesTemplateSelector.ScanListViewTemplate>
<s:PanesTemplateSelector.SignalListViewTemplate>
<DataTemplate>
<p:SignalListView />
</DataTemplate>
</s:PanesTemplateSelector.SignalListViewTemplate>
</s:PanesTemplateSelector>
</xcad:DockingManager.LayoutItemTemplateSelector>
其中 s
链接到您定义的名称空间,PanesTemplateSelector
和 p
链接到您定义自己的视图的名称空间