2017-09-23 32 views
-4

我不知道這是一個很好的做法,通過使用x:bind將事件綁定到異步任務方法?我基本上使用MVVM,其中我的ViewModel包含一些異步任務方法,並且我想x:將異步任務方法綁定到我的視圖中的事件(實際上它工作正常),但是,我聽到我們不應該把事件變成異步任務。可以將事件x:綁定到異步任務方法嗎?

下面是一些代碼例如:
事件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

據我所知,無論是否使用'async',你都必須綁定到'void'方法 –

+0

爲什麼使用x:bind而不是命令? – AzzamAziz

+1

這是異步無效的,沒關係。您不必爲UI事件處理程序使用異步任務。 –

回答

3

如果你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將調用該任務,並且不知道何時完成。由於這是與用戶界面相關的,所以我們不在意從它回來。

相關問題