Windoe Phone 7: Подтверждение от пользователя или InteractionRequest with Confirmation (PRISM)
Windows Mobile | создано: 04.01.2012 | опубликовано: 04.01.2012 | обновлено: 13.01.2024 | просмотров: 4960
Занимаясь разработкой нового приложения для Windows Phone столкнулся с тем, что при использовании MVVM (Prism) не очень получается спросить у пользователя подтверждение на выполнение какого-либо действия. Пришлось искать своё решение, которое оказалось очень простым.
Суть вопроса
Требуется у пользователя спросить подтверждение на выполнение какого-либо действия и ViewModel (используется MVVM библиотека Prism for Windows Phone). Для вывода простого сообщения в библиотеке используется MessageBoxAction, а вот для подтверждения ничего не нашел.
Простое решение
Создаю класс ConfirmMessageBoxAction, который будет являться визуализатором подтверждения вызванного из ViewModel. Класс наследуется от TriggerAction<DependencyObject>, а это значит, что надо переопределить некоторые методы. Вот весь класс:
/// <summary> /// Displays a message box with the /// content of the <see cref="InteractionRequestedEventArgs"/> /// as the item with MessageBoxButton. /// </summary> public class ConfirmMessageBoxAction : TriggerAction<DependencyObject> { /// <summary> /// Invokes the action. /// </summary> /// <param name="parameter">The parameter to the action. /// If the Action does not require a parameter, /// the parameter may be set to a null reference.</param> protected override void Invoke(object parameter) { var requestedEventArgs = parameter as InteractionRequestedEventArgs; if (requestedEventArgs == null) { return; } MessageBoxResult result = MessageBox.Show( (string)requestedEventArgs.Context.Content, requestedEventArgs.Context.Title, MessageBoxButton.OKCancel); if (result == MessageBoxResult.OK) { if (requestedEventArgs.Callback != null) { requestedEventArgs.Callback.Invoke(); } } } }
Не трудно заметить, что если пользователь нажимает [Отмена], то делегат просто не вызывается. Такую ситуацию, можно с легкостью обработать, например, так:
this._updateRequest.Raise( new Confirmation { Title = "Подтверждение", Content = "Повторить запрос в банк?" }, (c) => { this._showMessage("Уведомление", "Иду в банк"); });
В строке 2 создаем Confirmation с параметрами, а делегатом ставим действие, которое будет выполнено только в случае нажатия кнопки [Ok].
Теперь немного об использовании
Создаю во ViewModel свойство:
#region свойство UpdateConfirmationRequest /// <summary> /// Calabonga: поле для хранения значений свойства /// <see cref="ConfirmationRequest"/> /// </summary> private readonly InteractionRequest<Confirmation> _updateRequest; /// <summary> /// Calabonga: вызывается и XAML для отображение уведомлений. /// </summary> public IInteractionRequest UpdateConfirmationRequest { get { return _updateRequest; } } #endregion свойство UpdateConfirmationRequest
теперь в конструкторе надо инициализировать его:
this._updateRequest = new InteractionRequest<Confirmation>();
собственно говоря, на этом всё. Теперь если мне нужно спросить у пользователя о действительности обновления данных из банка, я просто вызываю метод, что показан во втором примере кода.
XAML
Что касаемо непосредственно самого кода в разметке, то я уже успел “завернуть” вышеуказанный класс в nuget-пакет. И, следовательно, в коде буду пользовать разметки именно с использованием пакета, для этого сначала подключу пространство имен:
xmlns:tools="clr-namespace:Calabonga.Phone.Extensions;assembly=Calabonga.Phone.Extensions"
а теперь просто использую его в коде:
<i:Interaction.Triggers> <i:EventTrigger EventName="Raised" SourceObject="{Binding UpdateConfirmationRequest}"> <tools:ConfirmMessageBoxAction /> </i:EventTrigger> </i:Interaction.Triggers>
Таким образом, всё получается очень просто и главное, работает.
после того как пользователь нажал [ок]
Nuget пакет
Если нет желания писать вручную, то можете установить nuget-пакет, в котором есть еще много полезного.
> Install-Package PhoneTools
Текущая версия 0.2.5 и спасибо за внимание.