AsyncRelayCommand ve AsyncRelayCommand<T>
AsyncRelayCommand
veAsyncRelayCommand<T>
, ICommand
tarafından RelayCommand
sunulan işlevleri zaman uyumsuz işlemler için destekle genişleten uygulamalardır.
Platform API'leri:
AsyncRelayCommand
,AsyncRelayCommand<T>
,RelayCommand
,IAsyncRelayCommand
,IAsyncRelayCommand<T>
Nasıl çalışırlar?
AsyncRelayCommand
ve AsyncRelayCommand<T>
aşağıdaki ana özelliklere sahiptir:
- Bunlar, kitaplığa dahil edilen zaman uyumlu komutların işlevlerini, geri dönen temsilciler için
Task
destekle genişletir. - Zaman uyumsuz işlevleri iptali desteklemek için ek
CancellationToken
bir parametreyle sarmalayabilir ve birCanBeCanceled
veIsCancellationRequested
özelliklerinin yanı sıra birCancel
yöntemi de kullanıma sunarlar. - Bekleyen bir
ExecutionTask
işlemin ilerleme durumunu izlemek için kullanılabilecek bir özelliği veIsRunning
bir işlemin ne zaman tamamlandığını denetlemek için kullanılabilecek bir özelliği kullanıma sunar. Bu, özellikle yükleme göstergeleri gibi kullanıcı arabirimi öğelerine bir komut bağlamak için yararlıdır. - ve
IAsyncRelayCommand<T>
arabirimlerini uygularlarIAsyncRelayCommand
, yani görünüm modeli, türler arasındaki sıkı bağlamayı azaltmak için bunları kullanarak komutları kolayca kullanıma açabilir. Örneğin bu, gerekirse bir komutun aynı genel API yüzeyini ortaya çıkararak özel bir uygulamayla değiştirilmesini kolaylaştırır.
Zaman uyumsuz komutlarla çalışma
Örnekte açıklanana RelayCommand
benzer bir senaryoyu ancak zaman uyumsuz bir işlemi yürüten bir komut olduğunu düşünelim:
public class MyViewModel : ObservableObject
{
public MyViewModel()
{
DownloadTextCommand = new AsyncRelayCommand(DownloadText);
}
public IAsyncRelayCommand DownloadTextCommand { get; }
private Task<string> DownloadText()
{
return WebService.LoadMyTextAsync();
}
}
İlgili kullanıcı arabirimi koduyla:
<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>
öğesine tıklandığında Button
komutu çağrılır ve ExecutionTask
güncelleştirilir. İşlem tamamlandığında özelliği, kullanıcı arabirimine yansıtılan bir bildirim oluşturur. Bu durumda hem görev durumu hem de görevin geçerli sonucu görüntülenir. Görevin sonucunu göstermek için yönteminin kullanılması TaskExtensions.GetResultOrDefault
gerekli olduğunu unutmayın; bu, iş parçacığını engellemeden (ve kilitlenmeye neden olabilir) henüz tamamlanmamış bir görevin sonucuna erişim sağlar.
Örnekler
- MVVM Araç Seti'ni uygulamada görmek için örnek uygulamaya (birden çok UI çerçevesi için) göz atın.
- Birim testlerinde daha fazla örnek de bulabilirsiniz.
MVVM Toolkit