public ColumnPickerViewModel(string identifier, IColumnsService columnsService, ISchedulerService schedulerService)
        {
            _identifier       = identifier;
            _columnsService   = columnsService;
            _schedulerService = schedulerService;

            _left  = new RangeObservableCollection <ColumnPickerItemViewModel>();
            _right = new RangeObservableCollection <ColumnPickerItemViewModel>();

            _columnsService.Initialised
            .ObserveOn(schedulerService.TaskPool)
            .StartWith(new [] { identifier })
            .Where(x => x == identifier)
            .Select(x =>
            {
                var visible = columnsService.VisibleColumns(identifier)
                              .Select(y => new ColumnPickerItemViewModel(y, ColumnHelper.DisplayName(y)))
                              .ToArray();

                var hidden = columnsService.HiddenColumns(identifier)
                             .Select(y => new ColumnPickerItemViewModel(y, ColumnHelper.DisplayName(y)))
                             .ToArray();

                return(new VisibleColumns(visible, hidden));
            })
            .ObserveOn(schedulerService.Dispatcher)
            .Subscribe(x =>
            {
                _left.Clear();
                _right.Clear();

                _left.AddRange(x.Hidden);
                _right.AddRange(x.Visible);
            })
            .DisposeWith(this);

            AddCommand = ReactiveCommand.Create(CanAddObservable())
                         .DisposeWith(this);

            RemoveCommand = ReactiveCommand.Create(CanRemoveObservable())
                            .DisposeWith(this);

            MoveupCommand = ReactiveCommand.Create(CanMoveupObservable())
                            .DisposeWith(this);

            MovedownCommand = ReactiveCommand.Create(CanMovedownObservable())
                              .DisposeWith(this);

            AddCommand.ActivateGestures()
            .Subscribe(x => Add())
            .DisposeWith(this);

            RemoveCommand.ActivateGestures()
            .Subscribe(x => Remove())
            .DisposeWith(this);

            MoveupCommand.ActivateGestures()
            .Subscribe(x => Moveup())
            .DisposeWith(this);

            MovedownCommand.ActivateGestures()
            .Subscribe(x => Movedown())
            .DisposeWith(this);
        }