4

DockingManager基になるビュー モデルによって管理される一連のドキュメントを表示するために、AvalonDock (2.0) コントロールを利用するコントロールがあります。

<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。これを行うために、次のようにStyleforを更新しました。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 内でホストされている場合、ビュー モデルでドキュメントを選択しても、選択したドキュメントが表示されないことがよくあります。以下の画像では、ユーザーが Customer ノードをクリックして編集しましたが、顧客ドキュメントは表示されませんでした。

AvalonDock の問題

ビュー モデル レイヤーはIsSelected期待どおりに設定されており、コントロールが を使用するTabControlと、選択したドキュメントが常に一番上に表示されました。

AvalonDock 内の問題のようです。私が見つけているのはLayoutItem、ビューモデルを介して a が選択されている場合、リストの最初のドキュメントがレイヤーで true に再選択され、レイヤーでトリクルアップして true にLayoutDocument/LayoutContent/LayoutElementリセットされることです。レイヤーでビューモデルにバインドしたいのですが、そのレイヤーにはありません。IsSelectedLayoutItemIsSelectedLayoutDocument/LayoutContent/LayoutElementDependencyProperty

ビューモデルにバインドする別の方法を試しましIsSelectedたが、これまでのところ成功していません。他の誰かがこの問題に遭遇しましたか? 回避策やその他のアプローチを知っていますか? ドキュメントの選択を行うためだけに、非 MVVM アプローチを使用する必要はありません。

編集: VSPackage を使用しても、再現テスト ケースを作成するのが難しいため、この問題はわかりにくいようです。ToolWindowデュアルs と Mediator メッセージを使用して実際のコントロールをシミュレートする次のテスト ケースでは、ドキュメントの選択は正常に機能します。

ツールウィンドウ

このテスト ケース (WPF アプリと VSPackage を使用) はこちらから入手できます( をクリックしTools=>My command nameてツール ウィンドウを起動し、1 つのウィンドウにドキュメント タイトルを入力して選択するか、ウィンドウでドキュメントを作成して選択しますDockingManager)。

4

1 に答える 1

2

他の人が何らかの形でこの問題に遭遇すると確信しており、より良い解決策があるはずなので、私はこれに賞金をかけています.

現時点では、ドキュメントの選択を機能させるための恐ろしいハックがあります。

  1. スタイルIsSelected内のドキュメント ビュー モデルへの同じバインディングを維持しました。LayoutItem
  2. 私のメイン ビュー モデルでは、SelectedItemどのドキュメントがプログラムによって (編集イベントなどによって) 選択されたかを追跡するためのプロパティを追加しました。
  3. コントロールにイベント ハンドラーを追加しました。このメソッドActiveContentChangedでは、ビュー モデルが選択されていない場合は再選択します。AvalonDock は、あきらめる前に、リスト内の最初のドキュメントの再選択を最大 6 回試みます。DocumentManagerSelectedItem
  4. PreviewMouseDownコントロールにイベント ハンドラーを追加しDocumentManager、このメソッドでビュー モデルを null にしてSelectedItem、ユーザーが開始した選択が引き続き機能するようにします。

繰り返しますが、これに対するより良い答えを探しています!

于 2013-04-13T14:38:33.047 に答える