Придумал такую схему.
Создал класс
public class MyCommand : ICommand, ICollection
То есть каждая команда включает еще вложенные команды (вложенные меню)
В классе окна добавляю свойство
public MyCommand Menu { get; set; }
В дизайнере делаю так
И так же в ресурсы окна добавляю вот что
Все. В коде формирую дерево из MyCommand, и меню в окне создается автоматически по дереву. Класс MyCommand реализует слияние, так что я спокойно могу добавлять к основному меню дополнительные пункты (например меню, которое создано в контенте TabItem).
Все гениально и просто :), вот только я не знаю, как отделить пункты меню сепараторами. Я ведь не оперирую контейнерами (MenuItem), поэтому не могу просто взять и добавить new Separator(). Посоветуйте что нибудь для этого.
Ответ
Разделитель — это часть представления, а не вью-модели. Идея делать маппинг один-к-одному между абстрактными командами и элементами управления во всём приложении — порочна. Подобный подход может использоваться в отдельных случаях, например, при генерации списка недавно открытых файлов в меню или предоставлении плагину абстрактного интерфейса для управления представлением (и то я бы задумался об альтернативах).
Запихнуть разделитель в список можно. Всего-то нужно сделать иерархию классов ("пункт меню", "пункт меню-разделитель", "пункт меню-команда"), присыпать шаблончиками и биндингами... Но хорошо задумайтесь: а правильно ли это? Если вы пойдёте по пути маппинга один-к-одному между элементами управления и вью-моделями, то вы превратите MVVM в фарс: у вас в слое вью-моделей появится упрощённая проекция представления, и представление станет полностью управляться из слоя вью-моделей. Сама вью-модель превратится в помесь контроллера и презентера. Это уже не MVVM.
Короче, не надо так делать.
Комментариев нет:
Отправить комментарий