AsyncRelayCommand a AsyncRelayCommand<T>
ICommand
AsyncRelayCommand<T>
ImplementaceAsyncRelayCommand
, které rozšiřují funkce, které RelayCommand
nabízí , s podporou asynchronních operací.
Rozhraní API platformy:
AsyncRelayCommand
,AsyncRelayCommand<T>
RelayCommand
, ,IAsyncRelayCommand
,IAsyncRelayCommand<T>
Jak fungují
AsyncRelayCommand
a AsyncRelayCommand<T>
mají následující hlavní funkce:
- Rozšiřují funkce synchronních příkazů obsažených v knihovně s podporou
Task
vrácení delegátů. - Můžou zabalit asynchronní funkce s dalším
CancellationToken
parametrem, který podporuje zrušení, a zpřístupňují aCanBeCanceled
IsCancellationRequested
vlastnosti a také metoduCancel
. - Zpřístupňují
ExecutionTask
vlastnost, která se dá použít ke sledování průběhu čekající operace aIsRunning
která se dá použít ke kontrole, kdy se operace dokončí. To je zvlášť užitečné pro vazbu příkazu k prvkům uživatelského rozhraní, jako jsou například indikátory načítání. - Implementují
IAsyncRelayCommand
rozhraní aIAsyncRelayCommand<T>
rozhraní, což znamená, že model viewmodel může pomocí těchto příkazů snadno vystavit příkazy, které snižují úzkou vazbu mezi typy. To například usnadňuje nahrazení příkazu vlastní implementací, která v případě potřeby zveřejní stejnou veřejnou plochu rozhraní API.
Práce s asynchronními příkazy
Představme si scénář podobný tomu, který je popsaný v RelayCommand
ukázce, ale příkaz, který spouští asynchronní operaci:
public class MyViewModel : ObservableObject
{
public MyViewModel()
{
DownloadTextCommand = new AsyncRelayCommand(DownloadText);
}
public IAsyncRelayCommand DownloadTextCommand { get; }
private Task<string> DownloadText()
{
return WebService.LoadMyTextAsync();
}
}
Související kód uživatelského rozhraní:
<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 kliknutí na Button
příkaz se vyvolá a ExecutionTask
aktualizuje se. Po dokončení operace vyvolá vlastnost oznámení, které se projeví v uživatelském rozhraní. V tomto případě se zobrazí stav úkolu i aktuální výsledek úkolu. Všimněte si, že chcete-li zobrazit výsledek úkolu, je nutné použít metodu TaskExtensions.GetResultOrDefault
- to poskytuje přístup k výsledku úkolu, který ještě nebyl dokončen bez blokování vlákna (a pravděpodobně způsobuje zablokování).
Příklady
- Podívejte se na ukázkovou aplikaci (pro více architektur uživatelského rozhraní) a podívejte se na sadu nástrojů MVVM v akci.
- Další příklady najdete také v testech jednotek.