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 fungsionalitas perintah sinkron yang disertakan dalam pustaka, dengan dukungan untuk
Task
delegasi -returning. - Mereka dapat membungkus fungsi asinkron dengan parameter tambahan
CancellationToken
untuk mendukung pembatalan, dan mereka mengeksposCanBeCanceled
properti danIsCancellationRequested
, sertaCancel
metode. - Mereka mengekspos
ExecutionTask
properti yang dapat digunakan untuk memantau kemajuan operasi yang tertunda, danIsRunning
yang dapat digunakan untuk memeriksa kapan operasi selesai. Ini sangat berguna untuk mengikat perintah ke elemen UI seperti memuat indikator. - Mereka mengimplementasikan
IAsyncRelayCommand
antarmuka 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