【问题标题】:AvalonDock (2.0) + MVVM + VSPackage = document selection trouble?AvalonDock (2.0) + MVVM + VSPackage = 文件选择麻烦?
【发布时间】: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=&gt;My command name 启动工具窗口,并在一个窗口中输入文档标题以在窗口中选择或创建并选择一个文档DockingManager)。

【问题讨论】:

    标签: c# wpf mvvm vs-extensibility avalondock


    【解决方案1】:

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

    目前,我有一个可怕的技巧来让文档选择起作用:

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

    再次,寻找更好的答案!

    【讨论】:

    • 我没有在 VS 中使用过 Avalon(是 2010/12 年吗?) - 但我见过许多类似的问题(使用不同的 Avalon 组件)。一个问题,只是“幽默我”:) - 触发整个问题的“文档选择”是来自鼠标还是键盘? (即事件的潜在“来源”)。顺便说一句。你有任何简单的复制项目吗?我可以看一下,但我没有多少时间来设置它。
    • 我在 VS2010 中遇到了这个问题,2012 年还没有尝试过。当用户选择编辑文档时,会出现触发问题的文档选择。一条消息(使用调解器设计模式)从树视图控件/窗口发送到具有 DockingManager 的“设计器”控件/窗口。如果设计器视图模型没有文档,则添加它,并且在所有情况下,关联的文档视图模型都将 IsSelected 设置为 true。从 DockingManager 的角度来看,它应该只是看到更新的文档列表和/或文档 IsSelected 中的更改。
    • 今天没时间,但我会考虑明天创建一个示例项目。我将尝试在 VSPackage 之外引发错误。为了在 VSPackage 中运行 DockingManager,需要将 AvalonDock 安装在 GAC 或其他已知位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2017-09-23
    相关资源
    最近更新 更多