Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
ICommand AsyncRelayCommand<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
CancellationTokenparametru w celu obsługi anulowania, a także uwidaczniająCanBeCanceledwłaściwości iIsCancellationRequested, a także metodęCancel. - Uwidaczniają
ExecutionTaskwł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ą
IAsyncRelayCommandinterfejsy 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 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.
MVVM Toolkit