/// <summary> /// コンストラクタ /// </summary> /// <param name="modelPool"></param> public StopWatchViewModel(IModelPool modelPool) { // モデルの取得 var model = modelPool.StopWatch; // モデルプロパティを取得 IsRunning = model.IsRunning; FormattedLaps = model.FormattedLaps; IsVisibleMills = model.IsVisibleMillis; // 表示用に20msec毎に間引き FormattedTime = model.FormattedTime .Throttle(TimeSpan.FromMilliseconds(20), Scheduler.Immediate) .ToReadOnlyReactiveProperty(); // アンダースコア:破棄。使用しないということ。 // https://ufcpp.net/study/csharp/datatype/declarationexpressions/#underscore // http://blog.xin9le.net/entry/2017/05/28/020129 // STOPされたら、最速/最遅 ラップを表示して LapActivityへ遷移 IsRunning.Where(x => !x). Subscribe(_ => { // Toastを表示させる Messenger.Send(new ShowToastMessage( $"最速ラップ:{model.FastestLaps}, 最遅ラップ:{model.WorstLaps}")); // LapActivityへ遷移させる Messenger.Send(new StartViewMessage(typeof(LapViewModel))); }) .AddTo(_subscriptions); // 開始 or 停止 CommandStartOrStop = new ReactiveCommand(); // いつでも実行可能 CommandStartOrStop.Subscribe(_ => { model.StartOrStop(); }) .AddTo(_subscriptions); // 経過時間の記録 CommandLap = IsRunning.ToReactiveCommand(); // 実行中(IsRunning = true)のみ記録可能 CommandLap.Subscribe(_ => { model.Lap(); }) .AddTo(_subscriptions); // ミリ秒以下表示切替 CommandToggleVisibleMillis = new ReactiveCommand(); // いつでも実行可能 CommandToggleVisibleMillis.Subscribe(_ => { model.ToggleVisibleMillis(); }) .AddTo(_subscriptions); }
} = new ReactiveCommand(); // いつでも実行可能 public MainViewModel(IModelPool modelPool) { var stopWatch = modelPool.StopWatch; // ■プロパティの実装 // StopWatchModel の各プロパティをそのまま公開してるだけ IsRunning = stopWatch.IsRunning; Laps = stopWatch.Laps; IsVisibleMillis = stopWatch.IsVisibleMillis; // 表示用にthrottleで20ms毎に間引き。View側でやってもよいかも。 Time = stopWatch.Time.Throttle(TimeSpan.FromMilliseconds(20), Scheduler.Immediate).ToReadOnlyReactiveProperty(); // ミリ秒以下表示有無に応じて、format書式文字列を切り替え(これはModelでやるべき?) TimeFormat = stopWatch.IsVisibleMillis.Select(x => x ? @"mm\:ss\.fff" : @"mm\:ss").ToReadOnlyReactiveProperty(); // STOP されたら、最速/最遅ラップを表示して、LapActivity へ遷移 IsRunning.Where(x => !x) .Subscribe(_ => { // Toast を表示させる Messenger.Send(new ShowToastMessage( $"最速ラップ:{stopWatch.FastestLap}, 最遅ラップ:{stopWatch.WorstLap}")); // FIXME 時間がformatされてない // LapActivity へ遷移させる Messenger.Send(new StartViewMessage(typeof(LapViewModel))); // ホントは LapViewModel を指定して画面遷移すべき }) .AddTo(_subscriptions); // ■コマンドの実装 // 開始 or 終了 CommandStartOrStop = new ReactiveCommand(); // いつでも実行可能 CommandStartOrStop.Subscribe(_ => { stopWatch.StartOrStop(); }) .AddTo(_subscriptions); // 経過時間の記録 CommandLap = IsRunning.ToReactiveCommand(); // 実行中のみ記録可能 CommandLap.Subscribe(_ => { stopWatch.Lap(); }) .AddTo(_subscriptions); // ミリ秒以下表示の切り替え CommandToggleVisibleMillis = new ReactiveCommand(); // いつでも実行可能 CommandToggleVisibleMillis.Subscribe(_ => { stopWatch.ToggleVisibleMillis(); }) .AddTo(_subscriptions); }