事件x:绑定到异步任务方法是否可以?

时间:2017-09-23 02:10:06

标签: c# xaml asynchronous mvvm uwp

我想知道通过使用x:bind来将事件绑定到异步Task方法是一个好习惯吗?

基本上,我使用MVVM,我的ViewModel包含一些异步的Task方法,我想x:将异步Task方法绑定到我视图中的事件(实际上工作正常),但是,我听说我们不应该把事件变成异步任务。

以下是一些代码示例:
事件x:绑定到异步任务方法

SomeViewModel.cs

public class SomeViewModel
{
    public async Task DoneAsync()
    {
        //...some code
    }
}

SomeView.xaml

<button context="click" click="{x:bind DoneAsync}"/>


为了安全起见,我所做的就是在代码后面使用异步任务。

SomeView.xaml

<button context="click" click="Done_clicked"/>

SomeView.cs

public async void Done_clicked(...)
{
    await vm.DoneAsync();
}

1 个答案:

答案 0 :(得分:4)

如果您遵循MVVM模式,最好避免事件并改为使用命令。

我没有编译代码,所以它可能不是100%准确但这是个主意。

<Button Context="Click" Command="ButtonClickedCommand" />

在ViewModel中,您需要在全局级别定义委托命令。

DelegateCommand ButtonClickedCommand

在MVVM构造函数中,您需要将其初始化为您的方法。

ButtonClickedCommand = new DelegateCommand(ButtonClicked);

现在你的方法。这应该是异步的。

public async void ButtonClicked()
{
    // Your code here.
}

为什么您的代码应该是异步的?

您的UI方法应该是异步的,以避免冻结UI并中断用户。

为什么我的异步是异步无效而不是异步任务?

异步任务将强制代码等待代码。 async void将调用该任务,而不知道何时完成。由于这与用户界面有关,因此我们并不在乎回复它。