public RecordsViewModel(LocationUseCase locationUseCase) { // なんかフクザツになっちゃったけど、IsDmsFormat が変わる度に、 // ObservableCollection を ReactiveProperty<IEnumerable<string>> // に変換してます。 FormattedRecords = IsDmsFormat.CombineLatest( locationUseCase.Records.ToCollectionChanged().ToReactiveProperty(), (isDms, _) => { // ここは LINQ ね return(locationUseCase .Records .Select(l => $"{l.Time:HH:mm.ss} - {l.Latitude.Format(isDms)}/{l.Longitude.Format(isDms)}")); })
public MainViewModel(INavigationService navigationService, IPageDialogService dialogService, LocationUseCase locationUseCase) { // ■プロパティの実装 // LocationUseCase の各プロパティを必要なら加工して公開 IsRunning = locationUseCase.IsRunning.ToReadOnlyReactiveProperty(); // Location の時刻をフォーマットして公開 FormattedTime = locationUseCase.Location .Select(l => l.Time.ToString("HH:mm:ss")) .ToReadOnlyReactiveProperty(); // Location の緯度を度分秒または度にフォーマットして公開 FormattedLatitude = IsDmsFormat.CombineLatest( locationUseCase.Location.Select(l => l.Latitude), (isDms, lat) => lat.Format(isDms)) .ToReadOnlyReactiveProperty(); // Location の経度を度分秒または度にフォーマットして公開 FormattedLongitude = IsDmsFormat.CombineLatest( locationUseCase.Location.Select(l => l.Longitude), (isDms, lon) => lon.Format(isDms)) .ToReadOnlyReactiveProperty(); // 記録されたレコード群を件数として公開 RecordCount = locationUseCase.Records .ToCollectionChanged() .Select(_ => locationUseCase.Records.Count) .ToReadOnlyReactiveProperty(); //// STOP されたら、最も精度のよい位置情報を表示して、RecordsPage へ遷移 IsRunning .Buffer(2, 1) .Where(x => x[0] && !x[1]) .Subscribe(async _ => { // 最も精度のよい緯度経度を得る // 返値がメソッドは、その時点の情報でしかない(Reactiveではない)ので注意すること var bestLocation = locationUseCase.GetBestLocation(); var message = bestLocation.HasValue ? $"{bestLocation.Value.Latitude.Format(IsDmsFormat.Value)}/" + $"{bestLocation.Value.Longitude.Format(IsDmsFormat.Value)} です。" : "記録されてません"; //// Alert を表示させる await dialogService.DisplayAlertAsync("最も精度の良い位置は", message, "Close"); // RecordPage へ遷移させる await navigationService.NavigateAsync("RecordsPage"); }); // ■コマンドの実装 // 開始 or 終了 StartOrStopCommand = new ReactiveCommand(); // いつでも実行可能 StartOrStopCommand.Subscribe(_ => { locationUseCase.StartOrStop(); }); // 位置情報の記録 RecordCommand = IsRunning.ToReactiveCommand(); // 実行中のみ記録可能 RecordCommand.Subscribe(_ => { locationUseCase.Record(); }); }