2010-07-22 73 views
1

背景圖案/方法論對於動態文本菜單基於對象

我有下面的MVVM設計圖案並且通過在列表記錄的TreeViewItem選擇支持多種選擇一個TreeView的上收集。就目前而言,有幾種類型的TreeViewItem可供用戶選擇。

它們是:WorldFolder類型和

  • 兩個Root節點MyDataFodler它可以包含子Folder類型
  • 兒童的類型LocationFolder, PersonFolder, CollectionFolder
  • 兒童型Item節點LocationItem, PersonItem
  • CollectionFolder可以Folder節點包含Folder typ的子節點es

在所有這些工作中,只需很少的代碼就能很好地工作,並支持位置集合和人員集合以及集合中的集合。

問題/疑問

我的頂層視圖模型跟蹤TreeViewItems的選擇狀態和當前選擇的可以是ItemFolder甚至Root類型的節點的組合。根據用戶的選擇,我想創建一個動態的ContextMenu。到目前爲止這工作!當我選擇幾個LocationItem和/或PersonItem類型的節點時,我的視圖模型會生成一個自定義的ContextMenu。問題是複雜性!我的觀點模型很快就變成了幾十個if/else if/else語句來捕捉所有可能的排列!

例如:

if (_selectedItems.All(item => item is PersonItem)) // Only people selected 
{ 
    // Create ContextMenu based on only PersonItems 
} 
else if(_selectedItems.All(item => item is LocationItem)) // Only Locations 
{ 
    // Create ContextMenu based only on LocationItems 
} 
... 

有沒有更好的方式來更有效地處理用戶選擇所有可能的排列和生成我ContextMenus?

*很抱歉的代碼格式,它已經給了我悲傷的所有周*

回答

0

我不記得在那裏我讀到這一句名言: 有一個TreeView的工作,最好的辦法不是沒有使用TreeView

這是什麼意思?將功能移到樹節點並儘可能保持樹視圖。不幸的是,默認情況下樹節點並不是很多事件,但是很容易將樹視圖事件重定向到節點。

完成後,您可以覆蓋節點中的ContextMenuStrip屬性。第一個選定節點創建它想要處理的ToolStripItems的列表,並詢問允許的樹視圖(例如,使用FilterMenuItems(desiredItems)方法)。樹視圖詢問所有選定的節點可以處理哪些節點。結果是您的上下文菜單。

這應該適用於幾乎任何不同節點的計數,並保持樹(節點)易於維護。

編輯:當!錯過了WPF標籤,因此我無法評估可用事件,因爲我還沒有使用WPF

+0

雖然不是我正在尋找的答案,但確實把我的思路放在正確的軌道上,我正在做在WPF中非常相似。我無法將我的事件直接綁定到ViewModel,但是您的正確之處在於,當用戶右鍵單擊某個節點時,我應該使用與該節點相關的選項來填充ContextMenu。 – Matthew 2010-07-23 13:28:57