簡體   English   中英

WPF Datagrid.ItemsSource作為列表 <Anything> 並在Linq上使用

[英]WPF Datagrid.ItemsSource as List<Anything> and use on 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?

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

Linq擴展可用於通用枚舉( IEnumerable<> ), IListIEnumerable ,因此這些擴展將IList用於IList

由於List<DerivedClass>不是List<BaseClass> ,諸如datagrid1.ItemsSource as List<object>返回null ,您可以在以下問題中閱讀更多內容:

您可以解決調用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"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM