如何在没有任何特定 class 数据的情况下使用 IcollectionView 过滤器

How to use IcollectionView Filter without any specific class for the data

这是整个查询-

我有一个包含数据网格的 WPF 应用程序。从数据库中获取数据后,Datagrid 绑定到 IcollectionView,自动生成列为 True。在绑定数据或使用自动生成列方法时,我正在创建一个带有 excel.

等过滤器弹出窗口的 header 模板

当用户点击其中任何一列 header 时,将为用户弹出一个与 excel 过滤器相同的弹出窗口。一旦用户 check/uncheck 一个值并单击确定,它应该根据用户选择过滤数据。

这就是我想使用 IcollectionView 筛选器功能的地方。但是过滤器的每个解决方案都采用 class 来过滤数据。就像下面的 URL(正在使用 TraceDataItem class)-

我无法固定 class,因为数据网格自动生成列是真实的,数据可以是任何东西。如所有示例中所述,是否有任何方法可以对没有固定 class 的数据使用此过滤器功能?

如果需要解释,请让我知道您的任何疑问,而不是否决投票。

添加使用的代码- 这就是我用来在过滤器弹出窗口中从用户那里获取 checked/unchecked 值的方法-

var tempCollection = (from c in CurrentDistictValues where c.IsChecked == true select c);
                    var val = from c in tempCollection select c.Name;
                    List<object> itemsChecked = new List<object>();
                    itemsChecked = val.ToList();
                    string s = String.Join("','", itemsChecked);
                    StringBuilder t = new StringBuilder(s);
                    t.Append("'");
                    t.Insert(0, "'");
                    s = t.ToString();

s 将让用户选择的所有值以逗号分隔,以便同样可以应用于数据视图 rowfilter:-

itemSource.RowFilter = "[" + columnName + "]" + " " + " IN " + "(" + s + ")";

注意- itemSource 是当前代码中的 DataView,列名是我们正在应用过滤器的 属性。

那么现在如果我们使用 IcollectionView 作为 ItemSource ,应该采用什么方法?

如果您不知道 ICollectionView 中显示的元素类型,您仍然可以使用反射来过滤它们。像这样:

string propertyName = "Name"; //property to filter by
string valueToCompareAgainst = "x";
ICollectionView view = ...;
view.Filter = (obj) =>
{
    Type type = obj.GetType();
    System.Reflection.PropertyInfo pi = type.GetProperty(propertyName);
    if(pi != null)
    {
        object value = pi.GetValue(obj);
        return value.Equals(valueToCompareAgainst);
    }
    return false;
};