如何使用IcollectionView Filter而没有任何特定的数据类

时间:2017-05-23 12:49:43

标签: wpf filter datagrid icollectionview

这是整个查询 -

我有一个有数据网格的WPF应用程序。从AutoDatarate列获取数据后,Datagrid绑定到IcollectionView为True。在绑定数据时或在autogeneratingcolumn方法中,我正在创建一个带有像excel这样的过滤器弹出窗口的标题模板。

当用户点击任何这些列标题时,将为用户提供与excel过滤器相同的弹出窗口。用户选中/取消选中某个值并单击“确定”后,应根据用户选择过滤数据。

这就是我认为使用IcollectionView过滤器功能的地方。但是,过滤器的每个解决方案都需要一个类来过滤数据。如下面的URL(TraceDataItem类正在使用) -

Filtering ObservableCollection with ICollectionView

我没有固定的类,因为datagrid autogenerate列为true,数据可以是任何东西。有没有办法将此过滤器功能用于所有示例中提到的没有固定类的数据?

如果需要解释,请告诉我您的任何查询,而不是投票。

添加使用的代码 - 这是我用来在过滤器弹出窗口中从用户获取已检查/未检查的值 -

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();

将用户选择的所有值用逗号分隔,以便可以对dataview rowfilter应用相同的值: -

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

注意 - itemSource是目前代码中的DataView&amp;列名是我们应用过滤器的属性。

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

1 个答案:

答案 0 :(得分:0)

如果您不知道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;
};