Я подумал, что опубликую здесь в надежде, что, возможно, кто-то с опытом работы с MVVM сможет высказать мнение о том, является ли следующее предложение хорошей идеей:
Я использую фреймворк Cinch MVVM от Sacha Barber, который включает класс SimpleCommand Марлона Греча.
Единственное, чего нет у этого класса, а у некоторых других альтернатив это свойство Text, которое обычно можно использовать для привязки элементов пользовательского интерфейса к «Заголовку» командной операции. Следовательно, я пишу расширение для этого класса, которое предоставляет свойство Text.
Теперь я столкнулся с примером использования, когда я использую команду для переключения подключения к устройству. Я мог реализовать это множеством разных способов (не всегда - это программное обеспечение!). Одним из способов было бы выставить несколько объектов команд из моей ViewModel - один для «Disconnect» и один для «Connect»; пусть модель представления предоставляет свойство, которое указывает состояние соединения (IsConnected), и имеет представление, условно привязанное либо к команде Connect, либо к команде Disconnect. Моя реакция на эту опцию, однако, ... гадость!
Вместо этого я изначально начал изучать не только предоставление свойства Text, но и наличие объекта команды, реализующего INotifyPropertyChanged, так что свойство view может динамически изменяться с помощью viewmodel на «Connect» или «Disconnect» в зависимости от состояния системы. Делая это, я могу избежать нескольких команд и просто выставить один объект команды ToggleConnection.
Однако, начиная с этого пути, мне приходит в голову, что могут быть другие варианты этого шаблона, в соответствии с которыми пользовательский интерфейс должен быть изменен в соответствии с состоянием команды. Например, помимо изменения текста команды в соответствии с состоянием соединения, у вас могут быть места, где значок должен меняться в зависимости от состояния соединения. Итак, я начал писать класс Stateful, который реализует INotifyPropertyChanged и предоставляет два свойства - «Текст» и «Состояние». Я сделал класс универсальным, чтобы тип State мог быть определен пользователем (я обычно предпочитаю не использовать «object» там, где его можно избежать).
Вопрос, который у меня возникает ... Как вы думаете, это хорошая или плохая идея? Это может отличаться от первоначального намерения / замысла команд; Из того, что я видел, в целом может быть так, что объекты команд были предназначены для того, чтобы не сохранять состояния, поскольку они являются «глаголами» системы. С маршрутизированными командами, если я правильно понимаю вещи, обычно ожидается, что только цель команды будет иметь состояние. Тем более что одна и та же команда может быть перенаправлена на разные обработчики в зависимости от того, где объявлены привязки команд.
Итак, я думаю, что по крайней мере с перенаправленными командами состояние не имело бы смысла.
Однако я не имею дело с маршрутизируемыми командами - я специально имею дело с командами MVVM. В этом случае в принципе отсутствует условная маршрутизация команд - представления MVVM привязываются непосредственно к объектам команд конкретной модели представления, и они выполняют и могут выполнять обработчики.
В этом случае имеет ли смысл?
Я приложил копию соответствующего кода на случай, если он будет полезен / интересен.
Спасибо,
Фил