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"));
我搜索了 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"));