かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Xamarin.Forms + Prism.FormsのMVVMの基本的なクラス

変更通知用のINotifyPropertyChangedとコマンド用のICommand実装クラスが提供されています。

INotifyPropertyChangedの実装クラス

BindableBaseクラスになります。SetPropertyというメソッドがあって、変更通知プロパティを以下のように定義できるようになっています。

private int hoge;
public int Hoge
{
  get { return this.hoge; }
  set { this.SetProperty(ref this.hoge, value); }
}

この他に、指定したプロパティの変更通知ができるOnPropertyChangedメソッドなど、MVVMでアプリ書いたことがある人ならだれもが一度は実装したことあるようなおなじみのメソッドがあります。

ICommandの実装クラス

DelegateCommandクラスになります。コンストラクタの引数にExecute時に呼ばれる処理と、CanExecute時に呼ばれる処理を渡します。

this.HogeCommand = new DelegateCommand(this.HogeExecute, this.CanHogeExecute);

CanExecuteの変更通知に関してはRaiseCanExecuteChangedメソッドで行います。

this.HogeCommand.RaiseCanExecuteChanged();

RaiseCanExecuteChangedを呼ぶのは大体プロパティの変更タイミングなので、そういうケースに対応するためにObservePropertyというメソッドも定義されていたりします。式木で、プロパティを渡すことで、渡したプロパティが変更があったときにRaiseCanExecuteChangedを自動で呼び出してくれるようになります。 例えば、Titleプロパティが変わったときにRaiseCanExecuteChangedが呼ばれるようにするには以下のように書きます。

this.HogeCommand = new DelegateCommand(this.HogeExecute, this.CanHogeExecute)
    .ObservesProperty(() => this.Title);