Мне интересно знать, как Вы люди там обрабатываете состояние отображения в приложении Silverlight с шаблоном MVVM. Скажем, у меня есть простая поисковая маска, которая асинхронно называет веб-сервис. В то время как поиск происходит, я хотел бы изменить gui соответственно: - отключают Кнопку поиска - Включают Кнопку отмены - и т.д.
Используя wpf я мог создать datatrigger, который связывает с некоторым свойством в viewmodel и затем вносит изменения в gui. Теперь, так как у меня нет datatrigger в Silverlight, каков был бы самый разумный способ достигнуть этого так же к datatrigger (аккуратный код в одном месте если возможный)?
(Я отправил подобный вопрос, но он был сформулирован плохо),
Мой стандартный способ сделать это - выставить свойство "ViewState" из модели представления (обычно перечисление). Затем представление связывается с этим свойством и использует visualstatemanager для переключения в соответствующие визуальные состояния в зависимости от перечисления.
DataStateSwitchBehavior из Expression Samples - хороший пример того, как сделать переключение на визуальные состояния.
EDIT В ответ на комментарий
Во-первых, при работе с VisualStates используйте Blend (никто не должен быть вынужден писать столько XAML вручную). Я полагаю, он даже есть во всех (большинстве?) подписках MSDN.
Использование Visual States начинается с Visual State Manager
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="GroupOne">
<VisualState x:Name="Normal"/>
<VisualState x:Name="Searching"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
Обычно вы добавляете это в layoutroot.
Менеджер визуальных состояний состоит из коллекции StateGroups, которая в свою очередь состоит из коллекции VisualStates.
Группы хранят взаимоисключающие состояния, так как вы можете иметь несколько визуальных состояний, активных в одно и то же время, но только одно состояние из каждой группы. Стандартным шаблоном является наличие пустого состояния, называемого чем-то вроде "Normal" или "Default", которое используется для отключения других состояний. По сути, это базовое состояние.
В вашем случае у вас будет визуальное состояние "Поиск", которое будет содержать раскадровку, отключающую различные кнопки, активирующую занятые анимации и т.д.
Самый удобный способ - использовать BusyIndicator
из Silverlight Toolkit Я полагаю. Поскольку он маскирует всю область, к которой вы его применяете, все кнопки автоматически отключаются.
Для кнопки отмены вам придется отредактировать шаблон BusyIndicator
, чтобы поместить его прямо рядом с анимацией загрузки, я думаю.
Затем вы должны просто привязать свойство BusyIndicator IsBusy
к соответствующему свойству в вашей модели просмотра, которое вы устанавливаете перед загрузкой и сбрасываете, когда закончите.