この記事は、Xamarin Advent Calendar 2020の22日目の記事です。
はじめに
以下の記事の続きです。
- Xamarin Community Toolkit カタログ(ビヘイビア・コンバーター編)
- Xamarin Community Toolkit カタログ(エフェクト・XAMLマークアップ拡張・コントロール編)
ソースコード
XamarinCommunityToolkitCatalog
MVVM
MVVMのビューモデルで使うような機能です。
AsyncCommand
Taskの非同期処理を扱えるコマンドです。allowsMultipleExecutionsをfalseにすれば、Taskの実行中は、CanExecuteがfalseを返すようになり、ボタンの2度押しを防げます。デフォルトではtrueです。onExceptionで例外発生時の処理を、continueOnCapturedContextで、Task実行時に設定するConfigureAwaitの引数を指定できます。
privateIAsyncCommand_asyncCommand;publicIAsyncCommandAsyncCommand=>_asyncCommand??=newAsyncCommand(async()=>{awaitTask.Delay(1000);},allowsMultipleExecutions:false);AsyncValueCommand
ValueTaskの非同期処理を扱えるコマンドです。機能的には、AsyncCommandと同じです。
privateIAsyncValueCommand<bool>_asyncValueCommand;publicIAsyncValueCommand<bool>AsyncValueCommand=>_asyncValueCommand??=newAsyncValueCommand<bool>(asyncshouldDelay=>{if(shouldDelay){awaitTask.Delay(1000);}},allowsMultipleExecutions:false);ObservableObject
INotifyPropertyChangedを実装したクラスです。SetPropertyでPropertyChangedの発火を行えます。PropertyChangedのハンドラーは、WeakReferenceで管理されます。
publicclassObservableObjectPageViewModel:ObservableObject{privateint_count;publicintCount{get=>_count;set=>SetProperty(ref_count,value);}privateICommand_countCommand;publicICommandCountCommand=>_countCommand??=newDelegateCommand(()=>Count++);}ObservableRangeCollection
複数データの追加、削除、置き換えができるObservableCollectionです。
publicclassObservableRangeCollectionPageViewModel{publicObservableRangeCollection<int>Items{get;}=newObservableRangeCollection<int>();privateICommand_addRangeCommand;publicICommandAddRangeCommand=>_addRangeCommand??=newDelegateCommand(()=>{Items.AddRange(Enumerable.Range(Items.Count,5));});privateICommand_removeRangeCommand;publicICommandRemoveRangeCommand=>_removeRangeCommand??=newDelegateCommand(()=>{Items.RemoveRange(Items.TakeLast(5));});privateICommand_replaceRangeCommand;publicICommandReplaceRangeCommand=>_replaceRangeCommand??=newDelegateCommand(()=>{Items.ReplaceRange(Enumerable.Range(0,5));});}おわりに
とりあえずこれで最後です。