Фон
У меня есть TreeView, который следует шаблону проектирования MVVM и поддерживает множественный выбор, записывая выборки TreeViewItem в список. В настоящее время существует несколько типов TreeViewItems, доступных для выбора пользователем.
Они есть:
- Два узла
Root
типаWorldFolder
иMyDataFodler
, которые могут содержать дочерние типыFolder
- Дочерние узлы
Folder
типовLocationFolder, PersonFolder, CollectionFolder
- Дочерние узлы
Item
типаLocationItem, PersonItem
CollectionFolder
может содержать дочерние узлыFolder
типов
Все это работает очень хорошо с очень небольшим количеством кода и поддерживает коллекции местоположений и людей, а также коллекции внутри коллекций.
Проблема/вопрос
Моя модель представления верхнего уровня отслеживает состояние выбора 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?
* Извините за форматирование кода, всю неделю это меня огорчало *