Windoe Phone 7: Подтверждение от пользователя или InteractionRequest with Confirmation (PRISM)
Windows Mobile | создано: 04.01.2012 | опубликовано: 04.01.2012 | обновлено: 13.01.2024 | просмотров: 5221
Занимаясь разработкой нового приложения для 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 и спасибо за внимание.