public BasicMatrixFilterDataProviderVM(FilterVM filter) : base(filter)
        {
            if (!(filter.UnderlayingFilter is BasicMatrixFilter))
            {
                throw new ArgumentException("BasicMatrixFilterDataVM can only handle BasicMatrixFilter type of underlaying filter (is: " + filter.UnderlayingFilter.GetType() + " | must be: BasicMatrixFilter)");
            }

            concreteFilter = (BasicMatrixFilter)filter.UnderlayingFilter;

            Matrix = new ObservableCollection <ObservableCollection <PrimitiveWrapper <double> > >();

            IncrementHeight = new RelayCommand(() => { Height++; });
            DecrementHeight = new RelayCommand(() => { Height--; }, (_) => { return(Height > 1); });
            IncrementWidth  = new RelayCommand(() => { Width++; });
            DecrementWidth  = new RelayCommand(() => { Width--; }, (_) => { return(Width > 1); });


            for (int i = 0; i < concreteFilter.FilterData.GetLength(0); i++)
            {
                Matrix.Add(new ObservableCollection <PrimitiveWrapper <double> >());
                for (int j = 0; j < concreteFilter.FilterData.GetLength(1); j++)
                {
                    Matrix[i].Add(new PrimitiveWrapper <double>(concreteFilter.FilterData[i, j]));
                }
            }
            Width  = Matrix.Count;
            Height = Matrix[0].Count;


            this.PropertyChanged += OnDimensionsChanged;
        }
        public GaussianFilterDataProviderVM(FilterVM filter) : base(filter)
        {
            if (!(filter.UnderlayingFilter is BasicMatrixFilter))
            {
                throw new ArgumentException("GaussianFilterDataVM can only handle BasicMatrixFilter type of underlaying filter");
            }

            width          = 3;
            height         = 3;
            concreteFilter = (BasicMatrixFilter)filter.UnderlayingFilter;
        }
        public FilterVM CreateNewFilter()
        {
            BasicMatrixFilter concreteFilter = new BasicMatrixFilter
                                                   (new double[3, 3] {
                { 1.0, 1.0, 1.0 },
                { 1.0, 1.0, 1.0 },
                { 1.0, 1.0, 1.0 }
            });


            FilterVM vm = new FilterVM(concreteFilter);

            vm.Name   = "New Basic Filter";
            vm.DataVM = new BasicMatrixFilterDataProviderVM(vm);

            return(vm);
        }