この記事は、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));
});
}
おわりに
とりあえずこれで最後です。