如何在没有任何特定 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;
};
这是整个查询-
我有一个包含数据网格的 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;
};