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"); }