この記事は、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の引数を指定できます。
private IAsyncCommand _asyncCommand;
public IAsyncCommand AsyncCommand => _asyncCommand ??=
new AsyncCommand(async () =>
{
await Task.Delay(1000);
}, allowsMultipleExecutions: false);
AsyncValueCommand
ValueTaskの非同期処理を扱えるコマンドです。機能的には、AsyncCommandと同じです。
private IAsyncValueCommand<bool> _asyncValueCommand;
public IAsyncValueCommand<bool> AsyncValueCommand => _asyncValueCommand ??=
new AsyncValueCommand<bool>(async shouldDelay =>
{
if (shouldDelay)
{
await Task.Delay(1000);
}
}, allowsMultipleExecutions: false);
ObservableObject
INotifyPropertyChangedを実装したクラスです。SetPropertyでPropertyChangedの発火を行えます。PropertyChangedのハンドラーは、WeakReferenceで管理されます。
public class ObservableObjectPageViewModel : ObservableObject
{
private int _count;
public int Count
{
get => _count;
set => SetProperty(ref _count, value);
}
private ICommand _countCommand;
public ICommand CountCommand => _countCommand ??=
new DelegateCommand(() => Count++);
}
ObservableRangeCollection
複数データの追加、削除、置き換えができるObservableCollectionです。
public class ObservableRangeCollectionPageViewModel
{
public ObservableRangeCollection<int> Items { get; } =
new ObservableRangeCollection<int>();
private ICommand _addRangeCommand;
public ICommand AddRangeCommand => _addRangeCommand ??=
new DelegateCommand(() =>
{
Items.AddRange(Enumerable.Range(Items.Count, 5));
});
private ICommand _removeRangeCommand;
public ICommand RemoveRangeCommand => _removeRangeCommand ??=
new DelegateCommand(() =>
{
Items.RemoveRange(Items.TakeLast(5));
});
private ICommand _replaceRangeCommand;
public ICommand ReplaceRangeCommand => _replaceRangeCommand ??=
new DelegateCommand(() =>
{
Items.ReplaceRange(Enumerable.Range(0, 5));
});
}
おわりに
とりあえずこれで最後です。