AsyncRelayCommand és AsyncRelayCommand<T>

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 CancellationToken paraméterrel a megszakítás támogatásához, és rendelkeznek egy CanBeCanceled és egy IsCancellationRequested tulajdonsággal, valamint egy Cancel metódussal.
  • Olyan tulajdonságot ExecutionTask tesznek elérhetővé, amely egy függőben lévő művelet előrehaladásának figyelésére használható, valamint egy IsRunning olyan 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 és IAsyncRelayCommand<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.