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
。これを行うために、次のように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 内でホストされている場合、ビュー モデルでドキュメントを選択しても、選択したドキュメントが表示されないことがよくあります。以下の画像では、ユーザーが Customer ノードをクリックして編集しましたが、顧客ドキュメントは表示されませんでした。
ビュー モデル レイヤーはIsSelected
期待どおりに設定されており、コントロールが を使用するTabControl
と、選択したドキュメントが常に一番上に表示されました。
AvalonDock 内の問題のようです。私が見つけているのはLayoutItem
、ビューモデルを介して a が選択されている場合、リストの最初のドキュメントがレイヤーで true に再選択され、レイヤーでトリクルアップして true にLayoutDocument/LayoutContent/LayoutElement
リセットされることです。レイヤーでビューモデルにバインドしたいのですが、そのレイヤーにはありません。IsSelected
LayoutItem
IsSelected
LayoutDocument/LayoutContent/LayoutElement
DependencyProperty
ビューモデルにバインドする別の方法を試しましIsSelected
たが、これまでのところ成功していません。他の誰かがこの問題に遭遇しましたか? 回避策やその他のアプローチを知っていますか? ドキュメントの選択を行うためだけに、非 MVVM アプローチを使用する必要はありません。
編集: VSPackage を使用しても、再現テスト ケースを作成するのが難しいため、この問題はわかりにくいようです。ToolWindow
デュアルs と Mediator メッセージを使用して実際のコントロールをシミュレートする次のテスト ケースでは、ドキュメントの選択は正常に機能します。
このテスト ケース (WPF アプリと VSPackage を使用) はこちらから入手できます( をクリックしTools=>My command name
てツール ウィンドウを起動し、1 つのウィンドウにドキュメント タイトルを入力して選択するか、ウィンドウでドキュメントを作成して選択しますDockingManager
)。