Шаблон / методология для динамического контекстного меню на основе коллекции объектов - PullRequest
1 голос
/ 22 июля 2010

Фон

У меня есть TreeView, который следует шаблону проектирования MVVM и поддерживает множественный выбор, записывая выборы TreeViewItem в список.В его нынешнем виде есть несколько типов TreeViewItems, доступных для выбора пользователем.

Это:

  • Два Root узла типа WorldFolder и MyDataFodler, которые могут содержать дочерние Folder типы
  • Дочерние Folderузлы типов LocationFolder, PersonFolder, CollectionFolder
  • дочерние Item узлы типа LocationItem, PersonItem
  • CollectionFolder могут содержать дочерние узлы Folder типов

Inвсе это очень хорошо работает с очень небольшим количеством кода и поддерживает коллекции Locations и People, а также коллекции в Collections.

Проблема / Вопрос

Моя модель представления верхнего уровня отслеживает состояние выбора TreeViewItems, и текущий выбор может быть комбинацией Item, Folder или даже 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 более эффективно?

* Извините за форматирование кода, это приносит мне горе всю неделю *

1 Ответ

0 голосов
/ 22 июля 2010

Не могу вспомнить, где я читал эту мудрую поговорку: лучший способ работы с TreeView - не работать с TreeView

Что это значит?Переместите функциональность в узлы дерева и держите вид дерева как можно большим пальцем.К сожалению, по умолчанию узел дерева не имеет много событий, однако, легко перенаправить события представления дерева на узлы.

После этого вы можете переопределить свойство ContextMenuStrip в своих узлах.Первый выбранный узел создает список ToolStripItems, который он хочет обработать, и запрашивает разрешенное представление дерева (например, с помощью метода FilterMenuItems (requiredItems)).Древовидное представление спрашивает все выбранные узлы, с какими узлами они смогут работать.Результатом является ваше контекстное меню.

Это должно работать практически с любым количеством различных узлов и позволяет легко поддерживать дерево (узлы).

Редактировать: Черт!Пропустил тэг WPF, поэтому я не могу оценить доступные события, так как я еще не работал с WPF

...