WPF Datagrid.ItemsSource as List<Anything> 并在 Linq 上使用

WPF Datagrid.ItemsSource as List<Anything> and use on Linq

我搜索了 10 多个小时。

其他 window

中有 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 中转换和使用 return 项:

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

Linq 扩展可用于通用枚举 (IEnumerable<>),IList 基本上是 IEnumerable,因此扩展将无法用于 IList

诸如 datagrid1.ItemsSource as List<object> returns null 之类的东西,因为 List<DerivedClass> 不是 List<BaseClass>,您可以在以下问题中阅读更多内容:

  • Convert List<DerivedClass> to List<BaseClass>
  • Cannot convert from List<DerivedClass> to List<BaseClass>

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

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

但是,如果您 class 有一个共同的 class 或接口,并且由于 IEnumerable<> 是协变体,您可以尝试这样的事情:

interface INamedObject
{
    string Name { get; }
}

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