如何使用MVVM Light从MessageDialog获取返回值?

时间:2021-09-20 04:13:31

I currently develop a metro style app using mvvm light framework.

我目前正在使用mvvm light框架开发一个metro风格的应用程序。

I have some commands, e.g. DeleteSelectedAppUserCommand. The user must confirm that he really wants to delete the user. So I have written a static Method "ShowMessageBoxYesNo" in the static class "DialogService".

我有一些命令,例如DeleteSelectedAppUserCommand。用户必须确认他确实要删除该用户。所以我在静态类“DialogService”中编写了一个静态方法“ShowMessageBoxYesNo”。

public static async Task<bool> ShowMessageBoxYesNo(string message, string title)
{
    MessageDialog dlg = new MessageDialog(message, title);

    // Add commands and set their command ids
    dlg.Commands.Add(new UICommand("Yes", null, 0));
    dlg.Commands.Add(new UICommand("No", null, 1));

    // Set the command that will be invoked by default
    dlg.DefaultCommandIndex = 1;

    // Show the message dialog and get the event that was invoked via the async operator
    IUICommand result = await dlg.ShowAsync();

    return (int)result.Id == 0;
}

In the command I want call this method, but I don't know how... Is this not possible? Following code doesn't work!

在命令中我想调用这个方法,但我不知道怎么...这不可能吗?以下代码不起作用!

#region DeleteSelectedAppUserCommand

/// <summary>
/// The <see cref="DeleteSelectedAppUserCommand" /> RelayCommand's name.
/// </summary>
private RelayCommand _deleteSelectedAppUserCommand;

/// <summary>
/// Gets the DeleteSelectedAppUserCommand RelayCommand.
/// </summary>
public RelayCommand DeleteSelectedAppUserCommand
{
    get
    {
        return _deleteSelectedAppUserCommand
            ?? (_deleteSelectedAppUserCommand = new RelayCommand(
            () =>
            {
                if (await DialogService.ShowMessageBoxYesNo("Do you really want delete the user?","Confirm delete")
                {
                    AppUsers.Remove(SelectedEditAppUser);
                }
            },
            () =>
                this.SelectedEditAppUser != null
            ));
    }
}
#endregion

Thanks for help! Michael

感谢帮助!迈克尔

1 个解决方案

#1


1  

If you want to use await in a lambda, you have to mark that lambda as async:

如果要在lambda中使用await,则必须将该lambda标记为async:

new RelayCommand(
    async () =>
    {
        if (await DialogService.ShowMessageBoxYesNo("Do you really want delete the user?", "Confirm delete")
        {
            AppUsers.Remove(SelectedEditAppUser);
        }
    },
    () =>
        this.SelectedEditAppUser != null
    )

This creates a void-returning async method which should be usually avoided. But I think it makes sense here, because you're basically implementing an event handler. And event handlers are the only place where void-returning async methods are normally used.

这会创建一个返回void的异步方法,通常应该避免这种方法。但我觉得这里有意义,因为你基本上是在实现一个事件处理程序。事件处理程序是通常使用void返回异步方法的唯一地方。

#1


1  

If you want to use await in a lambda, you have to mark that lambda as async:

如果要在lambda中使用await,则必须将该lambda标记为async:

new RelayCommand(
    async () =>
    {
        if (await DialogService.ShowMessageBoxYesNo("Do you really want delete the user?", "Confirm delete")
        {
            AppUsers.Remove(SelectedEditAppUser);
        }
    },
    () =>
        this.SelectedEditAppUser != null
    )

This creates a void-returning async method which should be usually avoided. But I think it makes sense here, because you're basically implementing an event handler. And event handlers are the only place where void-returning async methods are normally used.

这会创建一个返回void的异步方法,通常应该避免这种方法。但我觉得这里有意义,因为你基本上是在实现一个事件处理程序。事件处理程序是通常使用void返回异步方法的唯一地方。