2017-10-20 73 views
-1

如果我有這個...工具欄按鈕如何知道要等待?

<ContentPage.ToolbarItems> 
    <ToolbarItem Text = "Done" Clicked="Done_Clicked" /> 
    <ToolbarItem Text = "Cancel" Clicked="Cancel_Clicked" Priority="1" /> 
</ContentPage.ToolbarItems> 

在後面的代碼...

async void Cancel_Clicked(object sender, EventArgs e) 
{ 
    await Navigation.PopModalAsync(); 
} 

怎樣工具欄項目知道它的處理器是異步的?

回答

1

它沒有,則需要使用第三方庫,提供異步命令。我個人喜歡Nito.Mvvm.Async,它給你一個AsyncCommand,你可以使用並綁定你的函數。當異步函數運行時,該按鈕將被禁用,並且一旦該功能完成,該按鈕將重新啓用。

<ContentPage.ToolbarItems> 
    <ToolbarItem Text = "Done" Command="{Binding DoneCommand}" /> 
    <ToolbarItem Text = "Cancel" Command="{Binding CancelCommand}" Priority="1" /> 
</ContentPage.ToolbarItems> 

在您的視圖moodel。

public MyViewModel() 
{ 
    CancelCommand = new AsyncCommand(ExecuteCancel); 
} 

public AsyncCommand CancelCommand {get;} 

async Task ExecuteCancel() 
{ 
    await Navigation.PopModalAsync(); 
} 

這裏是一個更復雜的版本,禁用取消選項,除非完成選項當前正在運行。

<ContentPage.ToolbarItems> 
    <ToolbarItem Text = "Done" Command="{Binding DoneCommand}" /> 
    <ToolbarItem Text = "Cancel" Command="{Binding CancelCommand}" Priority="1" /> 
</ContentPage.ToolbarItems> 

在您的視圖moodel。

public MyViewModel() 
    { 
     DoneCommand = new AsyncCommand(ExecuteDone); 
     CancelCommand = new CustomAsyncCommand(ExecuteCancel, CanExecuteCancel); 
     PropertyChangedEventManager.AddHandler(DoneCommand, (sender, e) => CancelCommand.OnCanExecuteChanged(), nameof(DoneCommand.IsExecuting)); 
     PropertyChangedEventManager.AddHandler(CancelCommand, (sender, e) => CancelCommand.OnCanExecuteChanged(), nameof(CancelCommand.IsExecuting)); 
    } 

    private bool CanExecuteCancel() 
    { 
     return DoneCommand.IsExecuting && !CancelCommand.IsExecuting; 
    } 

    public AsyncCommand DoneCommand { get; } 
    public CustomAsyncCommand CancelCommand { get; } 

    async Task ExecuteDone() 
    { 
     await ... //Do stuff 

    } 

    async Task ExecuteCancel() 
    { 
     await Navigation.PopModalAsync(); 
    } 
2

Cancel_Clicked處理程序返回void因此您的工具欄項(UI線程)無法知道您的方法是否異步。

編輯:
內蒙古方法PopModalAsync()將運行異步 - 它會在未來一段時間內完成工作。 Cancel_Clicked()將立即返回,對於UI線程它是同步操作。

+0

那麼,它被稱爲同步? –

+1

這應該給你一些看法:https://stackoverflow.com/questions/37419572/if-async-await-doesnt-create-any-additional-threads-then-how-does-it-make-appl – Thowk

+0

我不知道看不到相關性。 –