WPF Datagrid.ItemsSource作为List <anything>并在Linq上使用

时间:2016-06-03 20:13:22

标签: c# wpf linq datagrid itemssource

我搜索了10个多小时。

其他窗口中有10个类和1个数据网格

datagrid1.ItemsSource = new List<class1>(); //+100 items in list
or
datagrid1.ItemsSource = new List<class2>(); //+100 items in list
or
datagrid1.ItemsSource = new List<class3>(); //+100 items in list

我需要转换并使用Linq中的退货项目:

var items = datagrid1.ItemsSource as List<???>;
datagrid1.ItemsSource = items.Where(a => a.GetType().GetProperty("Name").GetValue(a, null).ToString().Contains("text"));

我正在使用这些。但没有工作

using System.Linq;

var items = datagrid1.ItemsSource as IList;
//Error CS1061  'IList' does not contain a definition for 'Where' and no extension method 'Where' accepting a first argument of type 'IList' could be found (are you missing a using directive or an assembly reference?)

var items = datagrid1.ItemsSource as List<dynamic>; // return null
var items = datagrid1.ItemsSource as List<object>; // return null

我应该用什么东西代替???支持Linq?

注意:我不会使用class1或class2或class3

1 个答案:

答案 0 :(得分:2)

Linq扩展可用于通用枚举(IEnumerable<>),IList基本上是IEnumerable,因此扩展名不适用于IList

datagrid1.ItemsSource as List<object>之类的内容会返回null,因为List<DerivedClass>不是List<BaseClass>,您可以在此问题中阅读更多内容:

您可以解决调用Cast<>扩展名(可用于IEnumerable)的问题,此扩展项目可枚举为新IEnumerable<>将每个元素转换为指定的泛型类型:< / p>

datagrid1.ItemsSource.Cast<object>().Where(...)

但是,如果您的类具有公共类或接口,并且IEnumerable<>是共变体,那么您可以尝试以下方法:

interface INamedObject
{
    string Name { get; }
}

var items = datagrid1.ItemsSource as IEnumerable<INamedObject>;
datagrid1.ItemsSource = items.Where(a => a.Contains("text"));