我目前使用mvvm light框架开发了一个metro风格的应用程序。
我有一些命令,例如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;
}
在我要调用此方法的命令中,但我不知道如何... 这不可能吗?以下代码不起作用!
#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
感谢您的帮助! 迈克尔
答案 0 :(得分:1)
如果要在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
)
这会创建一个void
- 返回async
方法,通常应该避免这种方法。但我觉得这里有意义,因为你基本上是在实现一个事件处理程序。事件处理程序是唯一通常使用void
- 返回async
方法的地方。