Подтвердить что ты не робот

Почему события и команды в MVVM не поддерживаются WPF/Visual Studio?

При создании приложения WPF с шаблоном MVVM мне кажется, что я должен сам собрать необходимые инструменты, чтобы даже начать самую рудиментарную обработку событий, например.

  • AttachedBehaviors Я получаю от здесь
  • DelegateCommands Я получаю от здесь

Теперь я ищу способ обработать событие ItemSelected в ComboBox, и я получаю предложения трюков и обходных решений для этого (с помощью триггера XAML или имеют другие элементы, связанные с выбранным элементом и т.д.). Хорошо, я могу пойти по этой дороге, но, похоже, изобретает колесо. Было бы неплохо иметь команду ItemSelected, которую я могу обработать в моей ViewModel.

Я пропустил какой-то набор стандартных инструментов или все делают MVVM с WPF, в основном строя и создавая собственную коллекцию инструментов, чтобы они могли выполнять самые простые задачи сантехники с помощью событий и команд, которые принимают только пару строк в кодировке с помощью Click = "eventHandler"?

4b9b3361

Ответ 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, который помогает с привязками клавиш.

Это хорошее начало...