Почему события и команды в MVVM не поддерживаются WPF/Visual Studio?
При создании приложения WPF с шаблоном MVVM мне кажется, что я должен сам собрать необходимые инструменты, чтобы даже начать самую рудиментарную обработку событий, например.
- AttachedBehaviors Я получаю от здесь
- DelegateCommands Я получаю от здесь
Теперь я ищу способ обработать событие ItemSelected в ComboBox, и я получаю предложения трюков и обходных решений для этого (с помощью триггера XAML или имеют другие элементы, связанные с выбранным элементом и т.д.). Хорошо, я могу пойти по этой дороге, но, похоже, изобретает колесо. Было бы неплохо иметь команду ItemSelected, которую я могу обработать в моей ViewModel.
Я пропустил какой-то набор стандартных инструментов или все делают MVVM с WPF, в основном строя и создавая собственную коллекцию инструментов, чтобы они могли выполнять самые простые задачи сантехники с помощью событий и команд, которые принимают только пару строк в кодировке с помощью Click = "eventHandler"?
Ответы
Ответ 1
Согласно Джошу Смиту статья о MVVM, она была открыта миру в октябре 2005 года на Блог Джона Госсмана.
С этого момента я бы сказал, что для WPF/MVVM потребовалось еще 2-3 года, чтобы действительно принять и принять сообщество, к тому времени было слишком поздно модифицировать WPF для поддержки проблем с MVVM. Также я бы сказал, что WPF создал MVVM, поэтому кажется, что WPF изменился для поддержки MVVM.
Наконец, не все, кто использует WPF, используют MVVM, поэтому API должен поддерживать стандартное использование событий и т.д.
Итак, чтобы ответить на ваш вопрос, да, каждый в настоящее время объединяет свой собственный набор инструментов, так как "официальная" поддержка предоставляет только платформу DelegateCommands в настоящее время.
Ответ 2
Ты прав насчет сложности команд. Я стараюсь следовать шаблону M-V-VM как можно ближе, но я не могу оправдать сложные обходные пути, чтобы справиться с простым пользовательским событием.
По-моему, это нормально обрабатывать пользовательское событие в представлении, если это значительно упрощает ваш код. Если вы обрабатываете пользовательское событие в представлении, ваш код "Обратный код" должен немедленно вызвать метод в ViewModel. Таким образом, вы по-прежнему сохраняете свою логику в ViewModel... у вас просто есть небольшой сантехнический код (обработчик событий) в представлении. Я знаю, что пуристы M-V-VM считают, что в коде просмотра не должно быть кода, но иногда просто имеет смысл разрешить некоторый простой шаблонный код, например, обработчик событий. Помните, что другим может потребоваться прочитать/изменить ваш код в будущем, и гораздо легче понять обработчик событий, чем делегатский комитет.
Ответ 3
Рад слышать, что я не единственный, кто считает, что командные реализации там overkill. Кажется, что привязка к базам данных, естественно, хорошо поддерживается, но я несколько недель стучал головой, пытаясь понять привязки команд к вещам, отличным от кнопок и элементов, которые наследуются от него.
Спасибо за сообщение этого вопроса. Я думаю, что теперь я буду обрабатывать все события на уровне представления с перенаправлением на функции модели представления. Я думаю, именно так они преподавали базовый MVVM в одном из двух курсов Microsoft XAMLFest. Достаточно хорошо для меня!
Ответ 4
Becuase MVVM был "изобретен" после WPF... следовательно, почему большие части головоломки MVVM не являются частью структуры WPF.
Не только это, но и MVVM сам был объявлен "образцом", прежде чем он был даже доказан/практичен в реальном мире. Который является полной противоположностью того, что шаблоны все о - они, как правило, замечены и задокументированы после многих лет успешного использования множеством разных людей.
Один парень, придумывающий шаблон, не создает узор.
Ответ 5
Взгляните на этот шаблон проекта MVVM для VisualStudio.
http://blogs.msdn.com/llobo/archive/2009/05/01/download-m-v-vm-project-template-toolkit.aspx
С помощью этого шаблона вы получаете различные классы DelegateCommand, которые покрывают различные потребности для ICommands и класс CommandReference, который помогает с привязками клавиш.
Это хорошее начало...