我有一个控件,它利用 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 IsSelected
property, and when the view model is selected, I want to select and show the document in the DockingManager
. 为此,我将Style
for更新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 中时,通常在视图模型中选择文档不会将所选文档显示在视图中。在下图中,用户单击客户节点进行编辑,但客户文档没有进入视图。
视图模型层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
)。