Arhn - архитектура программирования

Шаблон/методология динамического контекстного меню на основе набора объектов

Фон

У меня есть 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?

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

22.07.2010

Ответы:


1

Я не могу вспомнить, где я прочитал это мудрое изречение: лучший способ работать с TreeView — это не работать с TreeView.

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

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

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

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

22.07.2010
  • Хотя это не совсем тот ответ, который я искал, он направил мои мысли в правильное русло, и я делаю что-то очень похожее в WPF. Я не могу напрямую привязать свои события к моим ViewModels, но вы правы в том, что когда пользователь щелкает правой кнопкой мыши узел, я должен заполнить ContextMenu вариантами, связанными с этим узлом, по сравнению с другими узлами. 23.07.2010
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..