4

我有一个控件,它利用 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>

The document view model has an IsSelectedproperty, and when the view model is selected, I want to select and show the document in the DockingManager. 为此,我将Stylefor更新LayoutItem如下:

<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 中时,通常在视图模型中选择文档不会将所选文档显示在视图中。在下图中,用户单击客户节点进行编辑,但客户文档没有进入视图。

AvalonDock 问题

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

这似乎是 AvalonDock 中的一个问题。我发现的是,当LayoutItem通过视图模型选择 a 时,列表中的第一个文档在LayoutDocument/LayoutContent/LayoutElement层被重新选择为 true ,这会逐渐备份并IsSelected在层重置为 true LayoutItem。我很想IsSelected在该层绑定到我的视图模型LayoutDocument/LayoutContent/LayoutElement,但DependencyProperty该层没有。

我已经尝试了绑定IsSelected到我的视图模型的替代方法,但到目前为止没有成功。有没有其他人遇到过这个问题?知道任何解决方法或其他方法吗?我不想求助于不得不使用非 MVVM 方法,只是为了进行文档选择。

编辑:这个问题似乎很模糊,因为我很难创建一个重现的测试用例,即使使用 VSPackage。ToolWindow在以下使用 dual s 和 Mediator 消息模拟实际控件的测试用例中,文档选择工作正常。

工具窗口

此测试用例(带有 WPF 应用程序和 VSPackage)可在此处获得(单击Tools=>My command name以启动工具窗口,并在一个窗口中输入文档标题以选择或创建并在带有 的窗口中选择一个文档DockingManager)。

4

1 回答 1

2

我在这个问题上悬赏,因为我相信其他人会以某种方式遇到这个问题,应该有更好的解决方案。

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

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

再次,寻找更好的答案!

于 2013-04-13T14:38:33.047 回答