public IdSelectionViewModel(IMarkerRegistrationService registrationService)
        {
            _registrationService = registrationService;

            var selectableIds = _registrationService.AvailableIds
                                .Select(id => new SelectableIdViewModel(id));

            SelectableIds = new ObservableCollection <SelectableIdViewModel>(selectableIds);

            SelectedId = SelectableIds.Select(
                selectable => selectable.SelectedCommand.Select(_ => selectable.Id)
                )
                         .Merge();
        }
        public MarkerRegistrationViewModel(
            IMarkerRegistrationService registrationService,
            IMarkerRegistrationField registrationField,
            ScaleAdapter scaleAdapter
            )
        {
            IdSelectionPanel = new IdSelectionViewModel(registrationService);

            FieldPosition = Observable.Return(registrationField.FieldPosition)
                            .ScaleToScreen(scaleAdapter)
                            .ToReactiveProperty();

            FieldSize = Observable.Return(registrationField.FieldSize)
                        .ScaleToScreen(scaleAdapter)
                        .ToReactiveProperty();

            IsCandidatePlaced = Observable.FromEvent <MarkerCandidateState>(
                h => registrationService.OnMarkerCandidateUpdated += h,
                h => registrationService.OnMarkerCandidateUpdated -= h
                )
                                .Do(value => Debug.WriteLine($"-> Candidate update = {value}"))
                                .Select(state => state == MarkerCandidateState.Detected)
                                .ToReactiveProperty();

            IsSelectingId = IsCandidatePlaced
                            .SelectMany(async isSelecting =>
            {
                if (isSelecting)
                {
                    await IdSelectionPanel.UpdateRegisteredIdsAsync();
                    return(IsCandidatePlaced.Value);
                }
                return(false);
            })
                            .ToReactiveProperty();

            _disposable = IdSelectionPanel.SelectedId
                          .Subscribe(id =>
            {
                registrationService.RegisterCandidate(id);
                IsSelectingId.Value = false;
                IsCandidatePlaced.ForceNotify();
            });
        }