浮动窗口后AvalonDock文档视图内容消失

问题描述 投票:0回答:1

我在项目中使用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>

为澄清问题,我们想分享三个屏幕截图。第一个屏幕截图显示了将文档移动到任何地方之前的文档。第二张屏幕截图显示了移至任何位置(浮动)后的文档。第三个屏幕截图显示了重新停靠在同一位置。实际上第一张和第三张图片相同,但我想清楚地表明实际内容仍然存在。

BEFOE DETACH

AFTER DETACH

AFTER RE-DOCK

wpf mvvm avalondock
1个回答
0
投票

[您需要在代码中添加DataTemplateSelector,以便教AvalonDock哪个DataTemplate用于您自己的View / ViewModel。

为此,您需要定义一个新的类,如下所示:

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);
    }
}

然后您需要按照以下步骤向您的XAML添加此类:

<xcad:DockingManager.LayoutItemTemplateSelector>
<s:PanesTemplateSelector>
    <s:PanesTemplateSelector.WatchListViewViewTemplate>
        <DataTemplate>
            <p:WatchListView />
        </DataTemplate>
    </s:PanesTemplateSelector.WatchListViewTemplate>
</s:PanesTemplateSelector>
</xcad:DockingManager.LayoutItemTemplateSelector>

s链接到您定义PanesTemplateSelector的名称空间,p链接到您定义自己的视图的名称空间

© www.soinside.com 2019 - 2024. All rights reserved.