Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 fungsionalitas perintah sinkron yang disertakan dalam pustaka, dengan dukungan untuk
Taskdelegasi -returning. - Mereka dapat membungkus fungsi asinkron dengan parameter tambahan
CancellationTokenuntuk mendukung pembatalan, dan mereka mengeksposCanBeCanceledproperti danIsCancellationRequested, sertaCancelmetode. - Mereka mengekspos
ExecutionTaskproperti yang dapat digunakan untuk memantau kemajuan operasi yang tertunda, danIsRunningyang dapat digunakan untuk memeriksa kapan operasi selesai. Ini sangat berguna untuk mengikat perintah ke elemen UI seperti memuat indikator. - Mereka mengimplementasikan
IAsyncRelayCommandantarmuka danIAsyncRelayCommand<T>, yang berarti bahwa viewmodel dapat dengan mudah mengekspos perintah menggunakan ini untuk mengurangi kopling yang ketat di antara jenis. 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>
Setelah mengklik Button, perintah dipanggil, dan yang diperbarui ExecutionTask . Ketika operasi selesai, properti menaikkan pemberitahuan yang tercermin dalam 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 pengujian unit.
MVVM Toolkit