2013-04-11 134 views
4

我有利用了AvalonDock(2.0)DockingManager控制,用于显示一组由底层视图模型管理的文档的控制:AvalonDock(2.0)+ MVVM + VSPackage =文档选择麻烦?

<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中的文档。要做到这一点,我更新了StyleLayoutItem如下:当控制是一个WPF应用程序中托管

<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> 

这种方法工作得很好,但是当控制是一个VSPackage的内举办,在视图中选择文档模型往往不会使选定的文档显示出来。在下面的图片中,用户点击了客户节点进行编辑,但客户文档未显示。

AvalonDock issue

视图模型层被设置IsSelected预期,并且当控制利用的TabControl,所选择的文档一直表现出在顶部。

这似乎是AvalonDock中的一个问题。我发现当通过视图模型选择LayoutItem时,列表中的第一个文档将在LayoutDocument/LayoutContent/LayoutElement图层重新选择为true,该图层将进行涓流备份,并在LayoutItem层将IsSelected重置为true。我希望将IsSelected绑定到LayoutDocument/LayoutContent/LayoutElement图层的我的查看模型,但该层没有DependencyProperty

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

编辑:看起来这个问题可能会被掩盖,因为即使使用VSPackage,我也很难创建复制测试用例。在以下测试用例中,模拟使用双ToolWindow和Mediator消息的实际控制,文档选择正常工作。

Tool Windows

这个测试用例(有一个WPF应用程序和VSPackage的)可用here(点击Tools=>My command name启动工具窗口,并在一个窗口中输入文档标题来选择或创建和选择文件与DockingManager的窗口)。

回答

2

我在这个问题上付出了一定的代价,因为我确信其他人会以这种或那种方式遇到这个问题,应该有更好的解决方案。

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

  1. 我保持相同IsSelectedLayoutItem风格结合到我的文档视图模型。
  2. 在我的主视图模型中,我添加了一个SelectedItem属性来跟踪哪个文档以编程方式被选中(通过编辑事件等)。
  3. 我在DocumentManager控件上添加了一个ActiveContentChanged的事件处理程序,在这种方法中,如果未选中,我在我的视图模型中重新选择SelectedItem。在放弃之前,AvalonDock尝试多达六次重新选择列表中的第一个文档!
  4. 我在DocumentManager控件上添加了PreviewMouseDown的事件处理程序,并且在此方法中,我将视图模型SelectedItem清零,以便用户启动的选择继续工作。

再次,寻找更好的答案!

+1

我还没有在VS内使用过Avalon(是2010/12?) - 但我见过很多类似的问题(带有不同的Avalon组件)。一个问题,只是'幽默我':) - 触发整个问题的'文档选择'是否来自鼠标或键盘? (即事件的基础“来源”)。顺便说一句。你有没有简单的repro项目 - 我可以看看 - 但我没有时间把它设置完成。 – NSGaga 2013-04-16 20:51:29

+0

我遇到了VS2010的问题,2012年还没有尝试过。当用户选择编辑文档时,触发该问题的文档选择会出现。一条消息(使用Mediator设计模式)从树视图控件/窗口发送到具有DockingManager的“设计器”控件/窗口。如果设计器视图模型没有该文档,则会添加该文档,并且在所有情况下关联的文档视图模型都将IsSelected设置为true。从DockingManager的角度来看,它应该只是看到更新的文档列表和/或IsSelected文档中的更改。 – 2013-04-16 21:23:46

+1

今天没时间,但我会在明天创建一个示例项目。我会尝试在VSPackage之外引发错误。为了在VSPackage中运行DockingManager,需要在GAC或其他已知位置安装AvalonDock。 – 2013-04-16 21:28:05