У меня есть ViewModel, отправляющий сообщение (используя MVVM Light Messenger) в представление, чтобы отобразить диалоговое окно Metro следующим образом:
В ViewModel я вызываю этот код из класса DialogBox:
DialogBox.ShowDialogBox(
(result) => { DialogResult(result); },
"Dialog Title",
"Dialog Message",
MessageDialogStyle.AffirmativeAndNegative
);
Это класс DialogBox, который занимается отправкой сообщения в представление:
public class DialogBox
{
public Action<MessageDialogResult> dialogResultCallBack { get; set; }
public string dialogTitle;
public string dialogText;
public MessageDialogStyle dialogStyle;
public string okButtonText;
public string cancelButtonText;
public DialogBox(Action<MessageDialogResult> _dialogResultCallBack, string _dialogTitle, string _dialogText, MessageDialogStyle _dialogStyle, string _okButtonText, string _cancelButtonText)
{
dialogResultCallBack = _dialogResultCallBack;
dialogTitle = _dialogTitle;
dialogText = _dialogText;
dialogStyle = _dialogStyle;
okButtonText = _okButtonText;
cancelButtonText = _cancelButtonText;
}
public static void ShowDialogBox(Action<MessageDialogResult> _dialogResultCallBack, string _dialogTitle, string _dialogText,
MessageDialogStyle _dialogStyle, string _affirmativeButtonText = "OK", string _negativeButtonText = "Cancel")
{
Messenger.Default.Send(new DialogBox(
_dialogResultCallBack,
_dialogTitle,
_dialogText,
_dialogStyle,
_affirmativeButtonText,
_negativeButtonText), GlobalResources.MessengerTokens.dialogTokenMainWindow);
}
}
В отделенном коде View есть следующий код для получения сообщения:
Messenger.Default.Register<DialogBox>(this, GlobalResources.MessengerTokens.dialogTokenMainWindow, dialogData =>
{
ShowMessageDialog(dialogData);
});
И ShowMessageDialog имеет дело с отображением фактического диалога. Все это работает нормально.
В настоящее время, когда пользователь выбирает утвердительный или отрицательный, результат возвращается и запускает вызов действия DialogResult(result) в ViewModel, как показано в самом верхнем фрагменте кода.
private void DialogResult(MessageDialogResult result)
{
if (result == MessageDialogResult.Affirmative)
{
//deal with the situation
}
else
{
//deal with the situation
}
}
На самом деле я хотел бы дождаться результата сразу после вызова метода DialogBox.ShowDialogBox() в ViewModel. Текущий подход заставляет код переходить к отдельному вызову метода, а не сразу обрабатывать результат. Чтобы проиллюстрировать это кратко,
if(condition)
{
DialogBox.ShowDialogBox(...);
//Needs some sort of await method to wait for results here
if(result == MessageDialogResult.Affirmative)
{
//do stuff
}
else
{
//do stuff
}
}
Я видел некоторый пример кода, по крайней мере, на WinForms, что ожидание результата проще (с использованием кода и без MVVM), делая что-то вроде:
if (MessageBox.Show("Title", "Message", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.OK)
Могу ли я применить аналогичный подход к моей текущей ситуации? Спасибо за любые предложения и извините, если мой вопрос был слишком длинным.