【发布时间】:2013-06-01 00:32:40
【问题描述】:
我有一个控件,它利用 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 更新为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,当控件使用TabControl时,所选文档始终显示在顶部。
这似乎是 AvalonDock 中的一个问题。我发现的是,当通过视图模型选择LayoutItem 时,列表中的第一个文档在LayoutDocument/LayoutContent/LayoutElement 层被重新选择为true,它会慢慢备份并在@987654336 处将IsSelected 重置为true @ 层。我很想在LayoutDocument/LayoutContent/LayoutElement 层将IsSelected 绑定到我的视图模型,但该层没有DependencyProperty。
我尝试了将IsSelected 绑定到我的视图模型的其他方法,但到目前为止没有成功。有没有其他人遇到过这个问题?知道任何解决方法或其他方法吗?我不想求助于不得不使用非 MVVM 方法,只是为了进行文档选择。
编辑:这个问题似乎很模糊,因为我很难创建重现测试用例,即使使用 VSPackage。在以下使用双 ToolWindows 和 Mediator 消息模拟实际控件的测试用例中,文档选择工作正常。
此测试用例(带有 WPF 应用程序和 VSPackage)可用here(单击Tools=>My command name 启动工具窗口,并在一个窗口中输入文档标题以在窗口中选择或创建并选择一个文档DockingManager)。
【问题讨论】:
标签: c# wpf mvvm vs-extensibility avalondock