wpf - AvalonDock 文档 View 内容在 float 窗口后消失

标签 wpf mvvm avalondock

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

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

BEFOE DETACH

AFTER DETACH

AFTER RE-DOCK

最佳答案

您需要在代码中添加一个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.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 链接到您在其中定义自己的 View 的命名空间

关于wpf - AvalonDock 文档 View 内容在 float 窗口后消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62259676/

相关文章:

c# - WPF 中的文件选择器对话框在哪里?

c# - 提高 WPF 列表框的绘制速度

vb.net - MVVM 与设计时数据的绑定(bind)在设计时正常工作,但在运行时不能正常工作

mvvm - 带有 Caliburn Micro 的 AvalonDock 2

c# - 带 Prism 区域适配器的 AvalonDock

c# - Avalondock 如何设置 LayoutDocument 的制表符宽度

wpf - 如何获取 WPF 弹出窗口的实际宽度

c# - WPF Listview - 难以在 ListView 中添加项目

silverlight - Silverlight如何在数据模板中使用按钮时提升列表框的选定项目

wpf - Catel + EntityFramework