我想知道通过使用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();
}
答案 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将调用该任务,而不知道何时完成。由于这与用户界面有关,因此我们并不在乎回复它。