Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A AsyncRelayCommand és a AsyncRelayCommand<T> olyan ICommand implementációk, amelyek az aszinkron műveletek támogatásával bővítik a RelayCommand által kínált funkciókat.
Platform API-k:
AsyncRelayCommand,AsyncRelayCommand<T>,RelayCommand,IAsyncRelayCommand,IAsyncRelayCommand<T>
Hogyan működnek?
AsyncRelayCommand és AsyncRelayCommand<T> a következő fő funkciókkal rendelkezik:
- Kibővítik a könyvtárban található szinkron parancsok funkcionalitását a
Taskértéket visszaadó delegáltak támogatásával. - Az aszinkron függvényeket kiegészíthetik egy további
CancellationTokenparaméterrel a megszakítás támogatásához, és rendelkeznek egyCanBeCanceledés egyIsCancellationRequestedtulajdonsággal, valamint egyCancelmetódussal. - Olyan tulajdonságot
ExecutionTasktesznek elérhetővé, amely egy függőben lévő művelet előrehaladásának figyelésére használható, valamint egyIsRunningolyan tulajdonságot, amely egy művelet befejeződésének ellenőrzésére használható. Ez különösen hasznos a parancsok felhasználói felületi elemekhez, például a betöltési mutatókhoz való kötéséhez. - Megvalósítják a
IAsyncRelayCommandésIAsyncRelayCommand<T>interfészeket, ami azt jelenti, hogy a nézetmodell ezek használatával könnyen közzétehet parancsokat a típusok közötti szoros csatolás csökkentése érdekében. Ez például megkönnyíti a parancsok cseréjét egy olyan egyéni implementációra, amely ugyanazt a nyilvános API-felületet teszi közzé, ha szükséges.
Aszinkron parancsok használata
Képzeljünk el egy, a RelayCommand mintában leírthoz hasonló forgatókönyvet, de egy aszinkron műveletet végrehajtó parancsot:
public class MyViewModel : ObservableObject
{
public MyViewModel()
{
DownloadTextCommand = new AsyncRelayCommand(DownloadText);
}
public IAsyncRelayCommand DownloadTextCommand { get; }
private Task<string> DownloadText()
{
return WebService.LoadMyTextAsync();
}
}
A kapcsolódó felhasználói felület kódjával:
<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>
A(z) Button elemre kattintva a parancs végrehajtódik, és a(z) ExecutionTask frissül. A művelet befejeződésekor a tulajdonság értesítést küld, amely a felhasználói felületen is megjelenik. Ebben az esetben a tevékenység állapota és a tevékenység aktuális eredménye is megjelenik. Vegye figyelembe, hogy a feladat eredményének megjelenítéséhez a metódust kell használni TaskExtensions.GetResultOrDefault – ez hozzáférést biztosít egy olyan tevékenység eredményéhez, amely még nem fejeződött be a szál blokkolása nélkül (és valószínűleg holtpontot okoz).
Examples
- Tekintse meg a mintaalkalmazást (több felhasználói felületi keretrendszer esetén) az MVVM-eszközkészlet működés közbeni megtekintéséhez.
- Az egységtesztekben további példákat is találhat.