c# – AvalonDock(2.0)MVVM VSPackage =文档选择有问题吗?

我有一个控件,它使用AvalonDock(2.0)DockingManager控件来显示由底层视图模型管理的一组文档:

<avalonDock:DockingManager DocumentsSource="{Binding Items}">
    <avalonDock:DockingManager.LayoutItemContainerStyle>
        <Style TargetType="{x:Type avalonDockControls:LayoutItem}" BasedOn="{StaticResource DocumentItem}"/>
    </avalonDock:DockingManager.LayoutItemContainerStyle>
    <avalonDockLayout:LayoutRoot>
        <avalonDockLayout:LayoutPanel Orientation="Horizontal">
            <avalonDockLayout:LayoutDocumentPane/>
        </avalonDockLayout:LayoutPanel>
    </avalonDockLayout:LayoutRoot>
</avalonDock:DockingManager>

文档视图模型具有IsSelected属性,当选择视图模型时,我想在DockingManager中选择并显示文档.为此,我更新了StyleItem的Style,如下所示:

<Style x:Key="DocumentItem" TargetType="{x:Type avalonDockControls:LayoutItem}">
    <Setter Property="Title" Value="{Binding Model.TabTitle}"/>
    <Setter Property="IsSelected" Value="{Binding Model.IsSelected, Mode=TwoWay}"/>
</Style>

当控件托管在WPF应用程序中时,此方法可以正常工作,但是当控件托管在VSPackage中时,通常在视图模型中选择文档不会使选定的文档进入视图.在下图中,用户单击了“客户”节点进行编辑,但客户文档未显示在视图中.

视图模型层按预期设置IsSelected,当控件使用TabControl时,所选文档始终显示在顶部.

它似乎是AvalonDock中的一个问题.我发现的是,当通过视图模型选择LayoutItem时,列表中的第一个文档在LayoutDocument / LayoutContent / LayoutElement图层被重新选择为true,该图层会在LayoutItem图层上向后反转并将IsSelected重置为true.我想在LayoutDocument / LayoutContent / LayoutElement图层中将IsSelected绑定到我的视图模型,但该层没有DependencyProperty.

我已经尝试过将IsSelected绑定到我的视图模型的其他方法,但到目前为止还没有成功.还有其他人遇到过这个问题吗?知道任何变通方法或其他方法吗?我不愿意使用非MVVM方法,只是为了进行文档选择.

编辑:似乎这个问题可能是模糊的,因为我很难创建一个再现测试用例,即使使用VSPackage也是如此.在以下使用双ToolWindows和Mediator消息模拟实际控件的测试用例中,文档选择正常.

此测试用例(带有WPF应用程序和VSPackage)可用于here(单击Tools =>我的命令名称以启动工具窗口,并在一个窗口中输入文档标题以选择或创建并在窗口中选择文档DockingManager).

最佳答案 我正在对这个问题给予赏金,因为我相信其他人会以这种或那种方式遇到这个问题,应该有一个更好的解决方案.

目前,我有一个可怕的黑客文件选择工作:

>我在LayoutItem样式中保持了与文档视图模型相同的IsSelected绑定.
>在我的主视图模型中,我添加了一个SelectedItem属性来跟踪以编程方式选择的文档(通过编辑事件等).
>我在DocumentManager控件上为ActiveContentChanged添加了一个事件处理程序,在此方法中,如果未选中,我会在视图模型中重新选择SelectedItem.在放弃之前,AvalonDock会尝试重新选择列表中的第一个文档六次!
>我在DocumentManager控件上为PreviewMouseDown添加了一个事件处理程序,在此方法中,我使视图模型SelectedItem为空,以便用户启动的选择继续工作.

再次,寻找更好的答案!

点赞