えムナウ Blog

えムナウ の なすがまま

目次

Blog 利用状況

ニュース


follow mnow at http://twitter.com


えムナウのプログラミングのページ

INETAJ

書庫

日記カテゴリ

ギャラリ

2015年4月24日 #

MvvmCross について 4

これからはよく使うクラスの説明をしていきたいと思う。

まずは MVVM と名がついているので ViewModel の基底クラス MvxViewModel から説明します。

名前空間 Cirrious.MvvmCross.ViewModels
public abstract class MvxViewModel : MvxNavigatingObject, IMvxViewModel

クラス図

image

 

abstract クラスで ViewModel で継承して使うように設計されている。

Dispatcher サポート
UIスレッドの Dispatcher をサポートしておりUIスレッドでのメソッド実行を行える。
protected IMvxMainThreadDispatcher Dispatcher;
protected void InvokeOnMainThread(Action action);

INotifyPropertyChanged サポート
ViewModel のプロパティが View に変更を通知する INotifyPropertyChanged をサポートする。
プロパティの set 時に使う SetProperty や イベントを発行する RaisePropertyChanged は当然ある。
RaisePropertyChanged をUIスレッドで常に実行するためのフラグや プロパティ名を string.Empty でイベントを発行すると全プロパティが変更されたとみなすよう促すメソッドもある。
ユニットテストのときなどイベントを発行されると邪魔な場合に抑止する機構もある。
public bool ShouldAlwaysRaiseInpcOnUserInterfaceThread();
public void ShouldAlwaysRaiseInpcOnUserInterfaceThread(bool value);
public void RaisePropertyChanged<T>(Expression<Func<T>> property);
public void RaisePropertyChanged([CallerMemberName] string whichProperty = "");
public virtual void RaiseAllPropertiesChanged();
public virtual void RaisePropertyChanged(PropertyChangedEventArgs changedArgs);
protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null);
protected virtual MvxInpcInterceptionResult InterceptRaisePropertyChanged(PropertyChangedEventArgs changedArgs);

遷移サポート
IMvxViewDispatcher と連携して各プラットフォームの ViewDispatcher で遷移を実現している。
例えばストアアプリやWindows Phoneなどは Close 時に前ページに遷移するがWPFではワーニングのログを出力する。
ShowViewModel は各種パラメータ形態に対応しているが最終的に最後のメソッド呼び出す。
protected IMvxViewDispatcher ViewDispatcher;
protected bool Close(IMvxViewModel viewModel);
protected bool ChangePresentation(MvxPresentationHint hint);
protected bool ShowViewModel<TViewModel>(object parameterValuesObject,
                                                 IMvxBundle presentationBundle = null,
                                                 MvxRequestedBy requestedBy = null);
protected bool ShowViewModel<TViewModel>(IDictionary<string, string> parameterValues,
                                                 IMvxBundle presentationBundle = null,
                                                 MvxRequestedBy requestedBy = null);
protected bool ShowViewModel<TViewModel>(IMvxBundle parameterBundle = null,
                                                 IMvxBundle presentationBundle = null,
                                                 MvxRequestedBy requestedBy = null);
protected bool ShowViewModel(Type viewModelType,
                                     object parameterValuesObject,
                                     IMvxBundle presentationBundle = null,
                                     MvxRequestedBy requestedBy = null);
protected bool ShowViewModel(Type viewModelType,
                                     IDictionary<string, string> parameterValues,
                                     IMvxBundle presentationBundle = null,
                                     MvxRequestedBy requestedBy = null);
protected bool ShowViewModel(Type viewModelType,
                                     IMvxBundle parameterBundle = null,
                                     IMvxBundle presentationBundle = null,
                                     MvxRequestedBy requestedBy = null);
private bool ShowViewModelImpl(Type viewModelType, IMvxBundle parameterBundle, IMvxBundle presentationBundle,MvxRequestedBy requestedBy);

ViwModelサポート
ViewModel の開始時や終了時には、virtual で修飾されたメソッドが呼ばれるので override して適切な処理を行える。
遷移のShowViewModelで指定した parameterBundle や requestedBy が取得できる。
ReloadFromBundle や SaveStateToBundle では中断・再開時に記憶しておく情報を利用できる。
public MvxRequestedBy RequestedBy { get; set; };
public void Init(IMvxBundle parameters);
public void ReloadState(IMvxBundle state);
public void SaveState(IMvxBundle state);
public virtual void Start();
protected virtual void InitFromBundle(IMvxBundle parameters);
protected virtual void ReloadFromBundle(IMvxBundle state);
protected virtual void SaveStateToBundle(IMvxBundle bundle);

posted @ 5:24