AsyncRelayCommand dan AsyncRelayCommand<T>

AsyncRelayCommand dan AsyncRelayCommand<T> adalah ICommand implementasi yang memperluas fungsionalitas yang ditawarkan oleh RelayCommand, dengan dukungan untuk operasi asinkron.

API Platform:AsyncRelayCommand, AsyncRelayCommand<T>, RelayCommand, IAsyncRelayCommand, IAsyncRelayCommand<T>

Cara kerjanya

AsyncRelayCommand dan AsyncRelayCommand<T> memiliki fitur utama berikut:

  • Mereka memperluas fungsi perintah sinkron yang disertakan dalam pustaka, dengan dukungan untuk delegate yang mengembalikan Task.
  • Mereka dapat membungkus fungsi asinkron dengan menambahkan parameter CancellationToken untuk mendukung pembatalan, dan menyediakan properti CanBeCanceled dan IsCancellationRequested, serta metode Cancel.
  • Mereka mengekspos ExecutionTask properti yang dapat digunakan untuk memantau kemajuan operasi yang tertunda, dan IsRunning yang dapat digunakan untuk memeriksa kapan operasi selesai. Ini sangat berguna untuk mengikat perintah ke elemen UI seperti memuat indikator.
  • Mereka mengimplementasikan antarmuka IAsyncRelayCommand dan IAsyncRelayCommand<T>, yang berarti bahwa view model dapat dengan mudah menyediakan perintah melalui antarmuka tersebut untuk mengurangi keterikatan erat antartipe. Misalnya, ini memudahkan untuk mengganti perintah dengan implementasi kustom yang mengekspos permukaan API publik yang sama, jika diperlukan.

Bekerja dengan perintah asinkron

Mari kita bayangkan skenario yang mirip dengan yang dijelaskan dalam RelayCommand sampel, tetapi perintah yang menjalankan operasi asinkron:

public class MyViewModel : ObservableObject
{
    public MyViewModel()
    {
        DownloadTextCommand = new AsyncRelayCommand(DownloadText);
    }

    public IAsyncRelayCommand DownloadTextCommand { get; }

    private Task<string> DownloadText()
    {
        return WebService.LoadMyTextAsync();
    }
}

Dengan kode UI terkait:

<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>

Saat Button diklik, perintah dijalankan, dan ExecutionTask diperbarui. Ketika operasi selesai, properti memicu notifikasi yang kemudian tercermin pada UI. Dalam hal ini, status tugas dan hasil tugas saat ini ditampilkan. Perhatikan bahwa untuk menunjukkan hasil tugas, perlu menggunakan TaskExtensions.GetResultOrDefault metode - ini menyediakan akses ke hasil tugas yang belum selesai tanpa memblokir utas (dan mungkin menyebabkan kebuntuan).

Contoh

  • Lihat contoh aplikasi (untuk beberapa kerangka kerja UI) untuk melihat Toolkit MVVM beraksi.
  • Anda juga dapat menemukan lebih banyak contoh dalam uji unit.