我有利用了AvalonDock(2.0)DockingManager
控制,用於顯示一組由底層視圖模型管理的文檔的控制:AvalonDock(2.0)+ MVVM + VSPackage =文檔選擇麻煩?
<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
爲LayoutItem
如下:當控制是一個WPF應用程序中託管
<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>
這種方法工作得很好,但是當控制是一個VSPackage的內舉辦,在視圖中選擇文檔模型往往不會使選定的文檔顯示出來。在下面的圖片中,用戶點擊了客戶節點進行編輯,但客戶文檔未顯示。
視圖模型層被設置IsSelected
預期,並且當控制利用的TabControl
,所選擇的文檔一直表現出在頂部。
這似乎是AvalonDock中的一個問題。我發現當通過視圖模型選擇LayoutItem
時,列表中的第一個文檔將在LayoutDocument/LayoutContent/LayoutElement
圖層重新選擇爲true,該圖層將進行涓流備份,並在LayoutItem
層將IsSelected
重置爲true。我希望將IsSelected
綁定到LayoutDocument/LayoutContent/LayoutElement
圖層的我的查看模型,但該層沒有DependencyProperty
。
我已經嘗試了將IsSelected
綁定到我的視圖模型的替代方法,但目前爲止沒有成功。有其他人遇到這個問題嗎?瞭解任何解決方法或其他方法?我討厭不得不使用非MVVM方法,只是爲了做文檔選擇。
編輯:看起來這個問題可能會被掩蓋,因爲即使使用VSPackage,我也很難創建複製測試用例。在以下測試用例中,模擬使用雙ToolWindow
和Mediator消息的實際控制,文檔選擇正常工作。
這個測試用例(有一個WPF應用程序和VSPackage的)可用here(點擊Tools=>My command name
啓動工具窗口,並在一個窗口中輸入文檔標題來選擇或創建和選擇文件與DockingManager
的窗口)。
我還沒有在VS內使用過Avalon(是2010/12?) - 但我見過很多類似的問題(帶有不同的Avalon組件)。一個問題,只是'幽默我':) - 觸發整個問題的'文檔選擇'是否來自鼠標或鍵盤? (即事件的基礎「來源」)。順便說一句。你有沒有簡單的repro項目 - 我可以看看 - 但我沒有時間把它設置完成。 – NSGaga 2013-04-16 20:51:29
我遇到了VS2010的問題,2012年還沒有嘗試過。當用戶選擇編輯文檔時,觸發該問題的文檔選擇會出現。一條消息(使用Mediator設計模式)從樹視圖控件/窗口發送到具有DockingManager的「設計器」控件/窗口。如果設計器視圖模型沒有該文檔,則會添加該文檔,並且在所有情況下關聯的文檔視圖模型都將IsSelected設置爲true。從DockingManager的角度來看,它應該只是看到更新的文檔列表和/或IsSelected文檔中的更改。 – 2013-04-16 21:23:46
今天沒時間,但我會在明天創建一個示例項目。我會嘗試在VSPackage之外引發錯誤。爲了在VSPackage中運行DockingManager,需要在GAC或其他已知位置安裝AvalonDock。 – 2013-04-16 21:28:05