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();
            });
        }