public ZoomHistoryMvvmViewModel()
        {
            _rangeHistoryCompare = new RangeHistorySameCompare();

            var vm1 = new LineRenderableSeriesViewModel
            {
                DataSeries      = FillData(new XyDataSeries <double, double>(), "firstDataSeries"),
                XAxisId         = _xAxisKey.Id,
                YAxisId         = _y0AxisKey.Id,
                StrokeThickness = 2,
                Stroke          = Color.FromArgb(0xff, 0x64, 0x95, 0xed),
            };

            var vm2 = new LineRenderableSeriesViewModel
            {
                DataSeries      = FillData(new XyDataSeries <double, double>(), "secondDataSeries"),
                XAxisId         = _xAxisKey.Id,
                YAxisId         = _y1AxisKey.Id,
                StrokeThickness = 2,
                Stroke          = Color.FromArgb(0xff, 0xff, 0x45, 0x00),
            };

            RenderableSeriesViewModels = new List <IRenderableSeriesViewModel> {
                vm1, vm2
            };

            _zoomHistoryManager = new ZoomHistoryManager();
            _zoomHistoryManager.RangeHistoryChanged += OnRangeHistoryChanged;

            _undoCommand = new ActionCommand(() =>
            {
                if (_zoomHistoryManager.CanUndo())
                {
                    _zoomHistoryManager.Undo();

                    var index = RangesHistory.IndexOf(_selectedRange, _rangeHistoryCompare);

                    _selectedRange = RangesHistory[index - 1];

                    OnPropertyChanged("SelectedRange");
                    RaiseUndoRedoCanExecute();
                }
            }, () => _zoomHistoryManager.CanUndo());

            _redoCommand = new ActionCommand(() =>
            {
                if (_zoomHistoryManager.CanRedo())
                {
                    _zoomHistoryManager.Redo();

                    var index = RangesHistory.IndexOf(_selectedRange, _rangeHistoryCompare);

                    _selectedRange = RangesHistory[index + 1];

                    OnPropertyChanged("SelectedRange");
                    RaiseUndoRedoCanExecute();
                }
            }, () => _zoomHistoryManager.CanRedo());
        }
            public bool Equals(ChartRangeHistory other)
            {
                if (ReferenceEquals(null, other))
                {
                    return(false);
                }
                if (ReferenceEquals(this, other))
                {
                    return(true);
                }

                return(other.XAxisRange.Equals(XAxisRange) &&
                       other.Y0AxisRange.Equals(Y0AxisRange) &&
                       other.Y1AxisRange.Equals(Y1AxisRange));
            }
        private void OnRangeHistoryChanged(object sender, HistoryChangedEventArgs args)
        {
            if (args.OldRanges != null)
            {
                for (int i = 0; i < args.DisposedAmount; i++)
                {
                    RangesHistory.RemoveAt(RangesHistory.Count - 1);
                }
            }

            if (args.NewRanges != null && args.NewRanges.Count > 0)
            {
                var newRanges = args.NewRanges;

                if (newRanges.Count < AxisAmount)
                {
                    newRanges = FillRanges(newRanges);
                }

                var item = new ChartRangeHistory(newRanges)
                {
                    ItemId = Guid.NewGuid().ToString()
                };
                RangesHistory.Add(item);
                while (RangesHistory.Count > ZoomHistoryManager.HistoryDepth)
                {
                    RangesHistory.RemoveAt(0);
                }
                OnPropertyChanged("RangesHistory");

                _selectedRange = item;
                OnPropertyChanged("SelectedRange");
            }

            RaiseUndoRedoCanExecute();
        }