Почему события и команды в MVVM так не поддерживаются WPF / Visual Studio? - PullRequest
18 голосов
/ 04 июня 2009

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

  • Прикрепленное поведение, которое я получаю от здесь
  • DelegateCommands, которые я получаю от здесь

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

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

Ответы [ 5 ]

16 голосов
/ 01 апреля 2010

Вы правы насчет сложности команд. Я стараюсь следовать шаблону M-V-VM как можно ближе, но не могу оправдать сложные обходные пути только для обработки простого пользовательского события.

На мой взгляд, нормально обрабатывать пользовательские события в представлении, если это значительно упрощает ваш код. Если вы обрабатываете пользовательское событие в представлении, его код должен немедленно вызвать метод в ViewModel. Таким образом, вы по-прежнему сохраняете свою логику во ViewModel ... у вас просто есть небольшой сантехнический код (обработчик событий) в View. Я знаю, что пуристы M-V-VM думают, что в выделенном коде View не должно быть кода, но иногда имеет смысл разрешить простой шаблонный код, такой как обработчик событий. Помните, что другим, возможно, придется читать / изменять ваш код в будущем, и намного проще понять обработчик событий, чем DelegateCommand.

7 голосов
/ 05 июня 2009

Согласно статье Джоша Смита о MVVM, она была представлена ​​миру в октябре 2005 года на блоге Джона Госсмана .

С тех пор я бы сказал, что понадобилось еще 2-3 года, чтобы WPF / MVVM действительно взлетели и были приняты сообществом, к тому времени уже было слишком поздно модифицировать WPF для поддержки проблем с MVVM. Кроме того, я бы сказал, что WPF создал MVVM, поэтому кажется, что изменение WPF для поддержки MVVM кажется обратным.

Наконец, не все, кто делает WPF, используют MVVM, поэтому API должен поддерживать стандартное использование событий и т. Д.

Итак, чтобы ответить на ваш вопрос, да, каждый в настоящее время собирает свой собственный набор инструментов, поскольку «официальная» поддержка в настоящее время предоставляет только структуру DelegateCommands.

3 голосов
/ 07 апреля 2010

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

Спасибо за размещение этого вопроса. Я думаю, что теперь я буду обрабатывать все события в слое представления с перенаправлением на функции модели представления. Я думаю, что именно так они преподавали базовый MVVM на одном из двухдневных курсов Microsoft XAMLFest. Достаточно хорошо для меня!

2 голосов
/ 08 марта 2010

Becuase MVVM был "изобретен" после WPF ... поэтому большие кусочки головоломки MVVM не являются частью инфраструктуры WPF.

Не только это, но и сам MVVM был объявлен «шаблоном» еще до того, как он был доказан / практикуется в реальном мире. Что является полной противоположностью шаблонов - они обычно обнаруживаются и документируются после многих лет успешного использования многими разными людьми.

Один парень, придумавший шаблон, не создает шаблон.

0 голосов
/ 05 июня 2009

Взгляните на этот шаблон проекта MVVM для VisualStudio.

http://blogs.msdn.com/llobo/archive/2009/05/01/download-m-v-vm-project-template-toolkit.aspx

С этим шаблоном вы получаете различные классы DelegateCommand, которые покрывают различные потребности в ICommands, и класс CommandReference, который помогает с привязками клавиш.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...