2009-08-24 6 views
1

я думал, что пост здесь в надежде, что, может быть, кто-то с MVVM опыт будет иметь возможность высказывать свое мнение по следующим вопросам, является ли хорошей идеей:Команды MVVM и Stateful - хорошая или плохая идея?

Я использую рамки Cinch MVVM Sacha Барбера, который включает в себя Marlon Класс SimpleCommand от Grech.

Одно свойство этого класса не имеет каких-либо других альтернатив - это свойство Text, которое обычно можно использовать для привязки элементов пользовательского интерфейса к «заголовку» операции команды. Следовательно, я писал расширение этого класса, которое предоставляет свойство Text.

Теперь я использовал случай, когда я использую команду для переключения подключения к устройству. Есть множество способов, которыми я мог бы это реализовать (не всегда - это программное обеспечение!). Один из способов заключается в том, чтобы вывести несколько объектов команды из моего ViewModel - один для «Отключить» и один для «Connect»; иметь модель представления, выставлять свойство, которое указывает состояние соединения (IsConnected), и иметь условное выражение для представления либо команде Connect, либо команде Disconnect. Моя реакция на этот вариант, хотя, это ... yuck!

Вместо этого я начал искать не только свойство Text, но также имел объект реализации, реализующий INotifyPropertyChanged, так что свойство text может быть динамически изменено с помощью viewmodel на «Connect» или «Disconnect» в соответствии с системным состоянием , Сделав это, я могу избежать наличия нескольких команд и просто выставить один объект команды ToggleConnection.

Начиная с этого пути, мне приходит в голову, что могут быть другие варианты этого шаблона, при которых пользовательский интерфейс должен быть изменен в соответствии с состоянием команды. Например, помимо изменения текста команды в соответствии с состоянием подключения, у вас могут быть места, где значок должен изменяться в соответствии с состоянием подключения. Итак, я начал писать класс «Stateful», который реализует INotifyPropertyChanged и предоставляет два свойства - «Текст» и «Состояние». Я создал общий класс, чтобы пользователь мог определить тип государства (обычно я предпочитаю не использовать «объект», где это можно избежать).

Вопрос у меня есть ... Как вы думаете, это хорошая или плохая идея? Он может отличаться от первоначального намерения/дизайна команд; Из того, что я видел, в общем случае может быть случай, когда объекты команды были неактивными, поскольку они являются «глаголами» системы. С помощью маршрутизируемых команд, если я правильно понимаю вещи, обычно ожидается, что цель команды будет иметь состояние. В частности, поскольку одна и та же команда может быть перенаправлена ​​для разных обработчиков в зависимости от того, где объявлены командные привязки.

Итак, я думаю, что, по крайней мере, с помощью маршрутизируемых команд, состояние не имеет смысла.

Однако я не имею дело с маршрутизируемыми командами - я имею дело с командами MVVM. В этом случае в основном нет условной маршрутизации команд - представления MVVM напрямую привязаны к определенным объектам команд viewmodel, и они выполняют и могут выполнять обработчики.

В этом случае это имеет смысл?

Я приложил копию кода, о котором идет речь, в случае его использования/интереса.

Спасибо, Фил

ответ

1

Это действительно до вас то, что вы думаете, было бы легче работать.

Я лично не ставил свойство .Text в свои команды просто потому, что я не получаю повторного использования из этих команд.Это отличается от RoutedUICommands, предоставляемых в рамках (или аналогичных пользовательских статических команд), потому что они используются повсеместно, и если перевод «Выход» должен был измениться в этой команде, это отразилось бы во всем приложении. В вашем примере это не так - все будет одноразовым.

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

Я определенно с вами на двух командах - blech. Большинство делегатов кнопок, которые вы пишете, должны будут каким-то образом отреагировать на состояние (служба, с которой вы разговариваете, не работает, эти данные должны быть заполнены таким образом, если пользователь выбрал это и т. Д.), Поэтому я действительно не считаю, что это неправильно делегат адаптируется к информации о состоянии в ViewModel.

Во всяком случае, это немного словесный ... вынос - «делать то, что чувствует себя комфортно».

+0

Спасибо Anderson, хорошие комментарии. Я думаю, что мой дискомфорт от предыдущего использования маршрутизированных команд, но тогда все поведение команд MVVM отличается. Я предпочитаю иметь командный текст в одном месте с командой, так как я обычно имею несколько элементов интерфейса, привязанных к нему. Я предполагаю, что с помощью viewmodel выполнить локализацию может показаться немного напуганным, но тогда она явно тесно связана с представлением пользовательского интерфейса. Я также вижу некоторые преимущества при динамическом формировании пользовательского интерфейса. привязка к списку команд со стилем/datatemplate, который создает текст объекта команды. Приветствия! – Phil

+0

В этом конкретном случае вы все еще ничего не набираете. Я понимаю, что вы связываете несколько кнопок с той же командой для свойства .Text, но как это отличается от привязки к другому свойству в вашем ViewModel «ConnectionText» или аналогичном свойстве. Просто хочу, чтобы вы подумали об этом ... вы говорите симматику здесь ... они, по сути, одно и то же в ваших сценариях использования. –

+0

Я получаю то, что вы говорите Андерсон, и подумал, что у вас есть свойство ConnectionText. То, что я видел, сделано раньше, хотя, и понравился это использование относительных привязок в сочетании с командами, например: Content = "{Binding RelativeSource = {RelativeSource Самого}, Path = Command.Description}" I например, по ряду причин - 1. он уменьшает количество мест, где должны быть указаны ссылки на свойства; Если мы просто говорим о тексте или «заголовке», отображаемом для кнопки, сокращение будет от 2 (свойства команды и текста MVVM) до 1. – Phil

0

Как и последний плакат, «Что бы ни было комфортно».

В моем случае я обычно использую что-то вроде DelegateCommand. Если мне нужно привязать некоторые данные, я привяжусь к виртуальной машине. Когда команда выполняется, она выполняется в моей виртуальной машине (через делегат, предоставленный делегатскому команду в init). Затем исполняемый делегат может/не может запускать некоторый код многократного использования для выполнения команды.

Похоже, вы хотите использовать команду как свою собственную виртуальную машину. Я никогда не думал о том, чтобы делать это перед собой, но если вам будет хорошо, сделайте это! :)

+0

Я думаю, что это хороший способ поместить его - команда вроде бы превращается в мини-виртуальную машину! Приветствия :) – Phil

Смежные вопросы