Windoe Phone 7: Подтверждение от пользователя или InteractionRequest with Confirmation (PRISM)

ru-RU | создано: 04.01.2012 | опубликовано: 04.01.2012 | обновлено: 27.12.2017 | просмотров за всё время: 4268

Занимаясь разработкой нового приложения для 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>

Таким образом, всё получается очень просто и главное, работает.

 1

после того как пользователь нажал [ок]

2

Nuget пакет

Если нет желания писать вручную, то можете установить nuget-пакет, в котором есть еще много полезного.

> Install-Package PhoneTools

Текущая версия 0.2.5 и спасибо за внимание.