Обработка состояния отображения в Silverlight с MVVM

Мне интересно знать, как Вы люди там обрабатываете состояние отображения в приложении Silverlight с шаблоном MVVM. Скажем, у меня есть простая поисковая маска, которая асинхронно называет веб-сервис. В то время как поиск происходит, я хотел бы изменить gui соответственно: - отключают Кнопку поиска - Включают Кнопку отмены - и т.д.

Используя wpf я мог создать datatrigger, который связывает с некоторым свойством в viewmodel и затем вносит изменения в gui. Теперь, так как у меня нет datatrigger в Silverlight, каков был бы самый разумный способ достигнуть этого так же к datatrigger (аккуратный код в одном месте если возможный)?

(Я отправил подобный вопрос, но он был сформулирован плохо),

7
задан Community 23 May 2017 в 12:26
поделиться

2 ответа

Мой стандартный способ сделать это - выставить свойство "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", которое используется для отключения других состояний. По сути, это базовое состояние.

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

7
ответ дан 7 December 2019 в 07:44
поделиться

Самый удобный способ - использовать BusyIndicator из Silverlight Toolkit Я полагаю. Поскольку он маскирует всю область, к которой вы его применяете, все кнопки автоматически отключаются.

Для кнопки отмены вам придется отредактировать шаблон BusyIndicator , чтобы поместить его прямо рядом с анимацией загрузки, я думаю.

Затем вы должны просто привязать свойство BusyIndicator IsBusy к соответствующему свойству в вашей модели просмотра, которое вы устанавливаете перед загрузкой и сбрасываете, когда закончите.

0
ответ дан 7 December 2019 в 07:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: