gpt4 book ai didi

c# - AvalonDock(2.0) + MVVM + VSPackage = 文档选择麻烦?

转载 作者:行者123 更新时间:2023-11-30 12:30:29 26 4
gpt4 key购买 nike

我有一个控件利用 AvalonDock (2.0) DockingManager 控件来显示一组由底层 View 模型管理的文档:

<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.为此,我更新了 LayoutItemStyle,如下所示:

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

AvalonDock issue

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

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

我尝试了将 IsSelected 绑定(bind)到我的 View 模型的替代方法,但到目前为止没有成功。还有其他人遇到过这个问题吗?知道任何解决方法或其他方法吗?我不愿意不得不使用非 MVVM 方法来进行文档选择。

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

Tool Windows

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

最佳答案

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

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

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

再次寻找更好的答案!

关于c# - AvalonDock(2.0) + MVVM + VSPackage = 文档选择麻烦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15939212/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com