/
FilteredDataSupport.cs
99 lines (88 loc) · 4.08 KB
/
FilteredDataSupport.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using System.Windows;
using System.Collections;
using DevExpress.Xpf.Grid;
using DevExpress.Data.Filtering.Helpers;
namespace Grid_MVVM_Filtering {
public class FilteredDataSupport {
public static readonly DependencyProperty VisibleDataProperty =
DependencyProperty.RegisterAttached("VisibleData", typeof(IList), typeof(FilteredDataSupport), new PropertyMetadata(onDataChanged));
public static void SetVisibleData(UIElement element, IList value) {
element.SetValue(VisibleDataProperty, value);
}
public static IList GetVisibleData(UIElement element) {
return (IList)element.GetValue(VisibleDataProperty);
}
static void OnCustomRowFilter(object sender, RowFilterEventArgs e) {
if(e.ListSourceRowIndex != 0)
return;
ChangeVisibleData(sender as GridControl);
}
static void OnFilterChanged(object sender, RoutedEventArgs e) {
GridControl grid = sender as GridControl;
if(grid.IsFilterEnabled == true)
ChangeVisibleData(grid);
}
static void ChangeVisibleData(GridControl grid) {
var res = grid.DataController.GetAllFilteredAndSortedRows().Cast<object>();
var visibleData = grid.GetValue(VisibleDataProperty) as IEnumerable<object>;
var excludedData = grid.GetValue(ExcludedDataProperty) as IEnumerable<object>;
if(excludedData != null) {
res = res.Except(excludedData);
}
(visibleData as IList).Clear();
foreach(object item in res) {
(visibleData as IList).Add(item);
}
}
private static Type GetItemType(IEnumerable data) {
foreach(object item in data)
return item.GetType();
return null;
}
public static readonly DependencyProperty ExcludedDataProperty =
DependencyProperty.RegisterAttached("ExcludedData", typeof(IList), typeof(FilteredDataSupport), new PropertyMetadata(null, onDataChanged, coerceExcludedData));
public static void SetExcludedData(UIElement element, IList value) {
element.SetValue(ExcludedDataProperty, value);
}
public static IList GetExcludedData(UIElement element) {
return (IList)element.GetValue(ExcludedDataProperty);
}
private static void onDataChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) {
GridControl grid = sender as GridControl;
if(grid == null)
return;
if(e.OldValue == null && e.NewValue != null) {
if(e.Property == ExcludedDataProperty)
grid.CustomRowFilter += excludeOnCustomRowFilter;
else if(e.Property == VisibleDataProperty) {
grid.CustomRowFilter += OnCustomRowFilter;
grid.FilterChanged += OnFilterChanged;
}
} else if(e.OldValue != null && e.NewValue == null) {
if(e.Property == ExcludedDataProperty)
grid.CustomRowFilter -= excludeOnCustomRowFilter;
else if(e.Property == VisibleDataProperty) {
grid.CustomRowFilter -= OnCustomRowFilter;
grid.FilterChanged -= OnFilterChanged;
}
}
grid.RefreshData();
}
private static object coerceExcludedData(DependencyObject sender, object data) {
GridControl grid = sender as GridControl;
grid.RefreshData();
return data;
}
static void excludeOnCustomRowFilter(object sender, RowFilterEventArgs e) {
GridControl grid = sender as GridControl;
IList data = grid.ItemsSource as IList;
IList excludedData = grid.GetValue(ExcludedDataProperty) as IList;
e.Visible = !excludedData.Contains(data[e.ListSourceRowIndex]);
e.Handled = !e.Visible;
}
}
}