public static IEnumerable <T> GetAutoFilterValues <T>(IEnumerable <T> source, DataGridColumn column)
        {
            var grid = column.DataGrid;

            // get all filter states without taking the current column into account
            var filterStates = grid.FilteredColumns
                               .Where(c => c != column)
                               .Select(c => new DataGridColumnValue <DataGridFilterState>(c, c.FilterState));

            var filter = C1DataGridFilterHelper.BuildFilterPredicate <T>(filterStates.ToArray(), DataGridFilterCombination.And);

            if (filter == null)
            {
                return(source);
            }

            var filteredElements = new List <T>();

            foreach (var elem in source)
            {
                if (filter(elem))
                {
                    filteredElements.Add(elem);
                }
            }
            return(filteredElements);
        }
        public override IDataGridFilter GetFilter()
        {
            var colorsFilter = new DataGridMultiValueFilter();

            colorsFilter.ItemTemplate = XamlReader.Parse(@"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns:local=""clr-namespace:DataGridSamples;assembly=" + new AssemblyName(Assembly.GetExecutingAssembly().FullName).Name + @""" xmlns:c1=""http://schemas.componentone.com/winfx/2006/xaml"">
            <StackPanel Orientation=""Horizontal"">
                <StackPanel.Resources>
                    <local:ColorConverter x:Key=""colorConverter""/>
                </StackPanel.Resources>
                <c1:C1CheckeredBorder BorderThickness=""1"" BorderBrush=""Black"" Background=""{Binding Converter={StaticResource colorConverter}}"" Width=""12"" Height=""12"" VerticalAlignment=""Center""/>
                <TextBlock Text=""{Binding}"" VerticalAlignment=""Center"" Margin=""2 0 0 0 ""/>
            </StackPanel>
        </DataTemplate>") as DataTemplate;
            colorsFilter.SetBinding(DataGridMultiValueFilter.ItemsSourceProperty, new Binding("ItemsSource")
            {
                Source    = DataGrid,
                Converter = CustomConverter.Create((value, type, parameter, culture) =>
                {
                    if (value is IEnumerable)
                    {
                        var enumerable     = ((IEnumerable)value).Cast <object>();
                        var colorConverter = new ColorConverter();
                        return(enumerable.Select(o => C1DataGridFilterHelper.GetPropertyValue <object>(o, FilterMemberPath)).Distinct().Select(o => (Color)colorConverter.Convert(o, typeof(Color), null, CultureInfo.CurrentCulture)).OrderBy(c => new C1HslColor(c).Hue));
                    }
                    return(value);
                })
            });
            colorsFilter.SetBinding(DataGridMultiValueFilter.BackgroundProperty, new Binding("HeaderBackground")
            {
                Source = DataGrid
            });
            colorsFilter.SetBinding(DataGridMultiValueFilter.ForegroundProperty, new Binding("HeaderForeground")
            {
                Source = DataGrid
            });
            colorsFilter.SetBinding(DataGridMultiValueFilter.BorderBrushProperty, new Binding("BorderBrush")
            {
                Source = DataGrid
            });
            colorsFilter.SetBinding(DataGridMultiValueFilter.MouseOverBrushProperty, new Binding("MouseOverBrush")
            {
                Source = DataGrid
            });
            colorsFilter.SetBinding(DataGridMultiValueFilter.PressedBrushProperty, new Binding("PressedBrush")
            {
                Source = DataGrid
            });
            colorsFilter.SetBinding(DataGridMultiValueFilter.FocusBrushProperty, new Binding("SelectedBackground")
            {
                Source = DataGrid
            });
            colorsFilter.SetBinding(DataGridMultiValueFilter.InputBackgroundProperty, new Binding("RowBackground")
            {
                Source = DataGrid
            });
            colorsFilter.SetBinding(DataGridMultiValueFilter.InputForegroundProperty, new Binding("RowForeground")
            {
                Source = DataGrid
            });
            var filter = new DataGridContentFilter
            {
                Content = new DataGridFilterList
                {
                    Items = new List <IDataGridFilterUnity>
                    {
                        new DataGridTextFilter(),
                        colorsFilter,
                    }
                }
            };

            return(filter);
        }
        //------------------------------------------------------------------
        #region ** implementation

        void UpdateHistogram()
        {
            // get items source
            var items = ItemsSource == null ? new List <object>() : ItemsSource.Cast <object>();

            try
            {
                _values = items.Select(o => C1DataGridFilterHelper.GetPropertyValue <double>(o, ValueMemberPath)).ToList();
            }
            catch
            {
                _values = new List <double>();
            }

            if (_values == null || _values.Count == 0)
            {
                Points = null;
                return;
            }

            // get range, bin count
            _calculatedMinimum = _values.Min();
            _calculatedMaximum = _values.Max();
            var min     = Minimum;
            var max     = Maximum;
            var range   = max - min;
            var binSize = range / BinCount;

            // group values in bins
            var bins = new int[BinCount];

            foreach (var d in _values)
            {
                if (d >= min && d <= max)
                {
                    var bin = (int)((d - min) / range * BinCount);
                    if (bin < 0 || bin >= bins.Length)
                    {
                        bin = 0;
                    }
                    bins[bin]++;
                }
            }

            // plot values
            var pc = new PointCollection();

            pc.Add(new Point(0, 0));
            for (int i = 0; i < BinCount; i++)
            {
                pc.Add(new Point(i, bins[i]));
                pc.Add(new Point(i + 1, bins[i]));
            }
            pc.Add(new Point(BinCount, 0));

            // update control
            Points = pc;
            RaisePropertyChanged("Maximum");
            RaisePropertyChanged("Minimum");
            RaisePropertyChanged("LowerValue");
            RaisePropertyChanged("UpperValue");
        }