我有利用了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
中的文档。要做到这一点,我更新了Style
为LayoutItem
如下:当控制是一个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的内举办,在视图中选择文档模型往往不会使选定的文档显示出来。在下面的图片中,用户点击了客户节点进行编辑,但客户文档未显示。
视图模型层被设置IsSelected
预期,并且当控制利用的TabControl
,所选择的文档一直表现出在顶部。
这似乎是AvalonDock中的一个问题。我发现当通过视图模型选择LayoutItem
时,列表中的第一个文档将在LayoutDocument/LayoutContent/LayoutElement
图层重新选择为true,该图层将进行涓流备份,并在LayoutItem
层将IsSelected
重置为true。我希望将IsSelected
绑定到LayoutDocument/LayoutContent/LayoutElement
图层的我的查看模型,但该层没有DependencyProperty
。
我已经尝试了将IsSelected
绑定到我的视图模型的替代方法,但目前为止没有成功。有其他人遇到这个问题吗?了解任何解决方法或其他方法?我讨厌不得不使用非MVVM方法,只是为了做文档选择。
编辑:看起来这个问题可能会被掩盖,因为即使使用VSPackage,我也很难创建复制测试用例。在以下测试用例中,模拟使用双ToolWindow
和Mediator消息的实际控制,文档选择正常工作。
这个测试用例(有一个WPF应用程序和VSPackage的)可用here(点击Tools=>My command name
启动工具窗口,并在一个窗口中输入文档标题来选择或创建和选择文件与DockingManager
的窗口)。
我还没有在VS内使用过Avalon(是2010/12?) - 但我见过很多类似的问题(带有不同的Avalon组件)。一个问题,只是'幽默我':) - 触发整个问题的'文档选择'是否来自鼠标或键盘? (即事件的基础“来源”)。顺便说一句。你有没有简单的repro项目 - 我可以看看 - 但我没有时间把它设置完成。 – NSGaga 2013-04-16 20:51:29
我遇到了VS2010的问题,2012年还没有尝试过。当用户选择编辑文档时,触发该问题的文档选择会出现。一条消息(使用Mediator设计模式)从树视图控件/窗口发送到具有DockingManager的“设计器”控件/窗口。如果设计器视图模型没有该文档,则会添加该文档,并且在所有情况下关联的文档视图模型都将IsSelected设置为true。从DockingManager的角度来看,它应该只是看到更新的文档列表和/或IsSelected文档中的更改。 – 2013-04-16 21:23:46
今天没时间,但我会在明天创建一个示例项目。我会尝试在VSPackage之外引发错误。为了在VSPackage中运行DockingManager,需要在GAC或其他已知位置安装AvalonDock。 – 2013-04-16 21:28:05