2013-04-11 137 views
4

我有利用了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中的文檔。要做到這一點,我更新了StyleLayoutItem如下:當控制是一個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的內舉辦,在視圖中選擇文檔模型往往不會使選定的文檔顯示出來。在下面的圖片中,用戶點擊了客戶節點進行編輯,但客戶文檔未顯示。

AvalonDock issue

視圖模型層被設置IsSelected預期,並且當控制利用的TabControl,所選擇的文檔一直表現出在頂部。

這似乎是AvalonDock中的一個問題。我發現當通過視圖模型選擇LayoutItem時,列表中的第一個文檔將在LayoutDocument/LayoutContent/LayoutElement圖層重新選擇爲true,該圖層將進行涓流備份,並在LayoutItem層將IsSelected重置爲true。我希望將IsSelected綁定到LayoutDocument/LayoutContent/LayoutElement圖層的我的查看模型,但該層沒有DependencyProperty

我已經嘗試了將IsSelected綁定到我的視圖模型的替代方法,但目前爲止沒有成功。有其他人遇到這個問題嗎?瞭解任何解決方法或其他方法?我討厭不得不使用非MVVM方法,只是爲了做文檔選擇。

編輯:看起來這個問題可能會被掩蓋,因爲即使使用VSPackage,我也很難創建複製測試用例。在以下測試用例中,模擬使用雙ToolWindow和Mediator消息的實際控制,文檔選擇正常工作。

Tool Windows

這個測試用例(有一個WPF應用程序和VSPackage的)可用here(點擊Tools=>My command name啓動工具窗口,並在一個窗口中輸入文檔標題來選擇或創建和選擇文件與DockingManager的窗口)。

回答

2

我在這個問題上付出了一定的代價,因爲我確信其他人會以這種或那種方式遇到這個問題,應該有更好的解決方案。

目前,我有一個可怕的黑客獲取文檔選擇工作:

  1. 我保持相同IsSelectedLayoutItem風格結合到我的文檔視圖模型。
  2. 在我的主視圖模型中,我添加了一個SelectedItem屬性來跟蹤哪個文檔以編程方式被選中(通過編輯事件等)。
  3. 我在DocumentManager控件上添加了一個ActiveContentChanged的事件處理程序,在這種方法中,如果未選中,我在我的視圖模型中重新選擇SelectedItem。在放棄之前,AvalonDock嘗試多達六次重新選擇列表中的第一個文檔!
  4. 我在DocumentManager控件上添加了PreviewMouseDown的事件處理程序,並且在此方法中,我將視圖模型SelectedItem清零,以便用戶啓動的選擇繼續工作。

再次,尋找更好的答案!

+1

我還沒有在VS內使用過Avalon(是2010/12?) - 但我見過很多類似的問題(帶有不同的Avalon組件)。一個問題,只是'幽默我':) - 觸發整個問題的'文檔選擇'是否來自鼠標或鍵盤? (即事件的基礎「來源」)。順便說一句。你有沒有簡單的repro項目 - 我可以看看 - 但我沒有時間把它設置完成。 – NSGaga 2013-04-16 20:51:29

+0

我遇到了VS2010的問題,2012年還沒有嘗試過。當用戶選擇編輯文檔時,觸發該問題的文檔選擇會出現。一條消息(使用Mediator設計模式)從樹視圖控件/窗口發送到具有DockingManager的「設計器」控件/窗口。如果設計器視圖模型沒有該文檔,則會添加該文檔,並且在所有情況下關聯的文檔視圖模型都將IsSelected設置爲true。從DockingManager的角度來看,它應該只是看到更新的文檔列表和/或IsSelected文檔中的更改。 – 2013-04-16 21:23:46

+1

今天沒時間,但我會在明天創建一個示例項目。我會嘗試在VSPackage之外引發錯誤。爲了在VSPackage中運行DockingManager,需要在GAC或其他已知位置安裝AvalonDock。 – 2013-04-16 21:28:05