AsyncRelayCommand i AsyncRelayCommand<T>
ICommand
AsyncRelayCommand<T>
Są to AsyncRelayCommand
implementacje, które rozszerzają funkcje oferowane przez RelayCommand
usługę , z obsługą operacji asynchronicznych.
Interfejsy API platformy:
AsyncRelayCommand
, ,AsyncRelayCommand<T>
RelayCommand
, ,IAsyncRelayCommand
IAsyncRelayCommand<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ą
Task
funkcji -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 iIsCancellationRequested
, 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 elementuIsRunning
, 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 iIAsyncRelayCommand<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 Button
polecenia 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.