Udostępnij za pośrednictwem


AsyncRelayCommand i AsyncRelayCommand<T>

ICommandAsyncRelayCommand<T> Są to AsyncRelayCommand implementacje, które rozszerzają funkcje oferowane przez RelayCommandusługę , z obsługą operacji asynchronicznych.

Interfejsy API platformy:AsyncRelayCommand, AsyncRelayCommand<T>, RelayCommand, , IAsyncRelayCommandIAsyncRelayCommand<T>

Jak działają

AsyncRelayCommand i AsyncRelayCommand<T> mają następujące główne funkcje:

  • Rozszerzają one funkcje poleceń synchronicznych zawartych w bibliotece z obsługą Taskfunkcji -returning delegatów.
  • Mogą opakowować funkcje asynchroniczne za pomocą dodatkowego CancellationToken parametru w celu obsługi anulowania, a także uwidaczniają CanBeCanceled właściwości i IsCancellationRequested , a także metodę Cancel .
  • Uwidaczniają ExecutionTask właściwość, która może służyć do monitorowania postępu oczekującej operacji, oraz elementu IsRunning , który może służyć do sprawdzania, kiedy operacja zostanie ukończona. Jest to szczególnie przydatne w przypadku powiązania polecenia z elementami interfejsu użytkownika, takimi jak wskaźniki ładowania.
  • Implementują IAsyncRelayCommand interfejsy i IAsyncRelayCommand<T> , co oznacza, że model viewmodel może łatwo uwidaczniać polecenia za pomocą tych poleceń w celu zmniejszenia ścisłego sprzężenia między typami. Na przykład ułatwia to zastąpienie polecenia niestandardową implementacją uwidacznianą w razie potrzeby tę samą publiczną powierzchnię interfejsu API.

Praca z poleceniami asynchronicznymi

Wyobraźmy sobie scenariusz podobny do scenariusza opisanego w przykładzie RelayCommand , ale polecenie wykonujące operację asynchroniczną:

public class MyViewModel : ObservableObject
{
    public MyViewModel()
    {
        DownloadTextCommand = new AsyncRelayCommand(DownloadText);
    }

    public IAsyncRelayCommand DownloadTextCommand { get; }

    private Task<string> DownloadText()
    {
        return WebService.LoadMyTextAsync();
    }
}

Za pomocą powiązanego kodu interfejsu użytkownika:

<Page
    x:Class="MyApp.Views.MyPage"
    xmlns:viewModels="using:MyApp.ViewModels"
    xmlns:converters="using:Microsoft.Toolkit.Uwp.UI.Converters">
    <Page.DataContext>
        <viewModels:MyViewModel x:Name="ViewModel"/>
    </Page.DataContext>
    <Page.Resources>
        <converters:TaskResultConverter x:Key="TaskResultConverter"/>
    </Page.Resources>

    <StackPanel Spacing="8" xml:space="default">
        <TextBlock>
            <Run Text="Task status:"/>
            <Run Text="{x:Bind ViewModel.DownloadTextCommand.ExecutionTask.Status, Mode=OneWay}"/>
            <LineBreak/>
            <Run Text="Result:"/>
            <Run Text="{x:Bind ViewModel.DownloadTextCommand.ExecutionTask, Converter={StaticResource TaskResultConverter}, Mode=OneWay}"/>
        </TextBlock>
        <Button
            Content="Click me!"
            Command="{x:Bind ViewModel.DownloadTextCommand}"/>
        <ProgressRing
            HorizontalAlignment="Left"
            IsActive="{x:Bind ViewModel.DownloadTextCommand.IsRunning, Mode=OneWay}"/>
    </StackPanel>
</Page>

Po kliknięciu Buttonpolecenia jest wywoływane polecenie i ExecutionTask zaktualizowane. Po zakończeniu operacji właściwość zgłasza powiadomienie, które jest odzwierciedlone w interfejsie użytkownika. W takim przypadku są wyświetlane zarówno stan zadania, jak i bieżący wynik zadania. Należy pamiętać, że aby pokazać wynik zadania, konieczne jest użycie TaskExtensions.GetResultOrDefault metody — zapewnia to dostęp do wyniku zadania, które nie zostało jeszcze ukończone bez blokowania wątku (i ewentualnie powoduje zakleszczenie).

Przykłady

  • Zapoznaj się z przykładową aplikacją (dla wielu struktur interfejsu użytkownika), aby zobaczyć, jak działa zestaw narzędzi MVVM Toolkit.
  • Więcej przykładów można również znaleźć w testach jednostkowych.