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



我搜索了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?

注意:我不会使用类 1 或类 2 或类 3

Linq扩展可用于泛型枚举(IEnumerable<>),IList基本上是一个IEnumerable,所以扩展将不适用于IList

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

  • 将 List 转换为 List
  • 无法从 List 转换为 List

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

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

相关内容

最新更新