我試着去過濾器適用於WPF DataGrid中和過濾器屬性需要一個謂語方法返回一個謂語< T >(其中T是僅在運行時知道)
例如:
dataGrid1.Filter = p => p.A_Field_Table1.Contains(textBox.Text);
但我的數據網格正在填充反射,所以我只知道運行時數據網格內的對象的類型。
然後我創建的動態生成謂詞< T>的方法:
public static Predicate<T> GetPredicate<T>(string column, string valueP, T objSource, string table)
{
Type itemType = typeof(T);
ParameterExpression predParam = Expression.Parameter(itemType, "p");
Expression left = Expression.Property(predParam, itemType.GetProperty("A_" + column+ "_" + table));
var valueStr= Expression.Constant(valueP);
var typeOfStr = valueStr.Type;
var containsMethod = typeOfStr.GetMethod("Contains", new [] { typeof(string) });
var call = Expression.Call(left, containsMethod, valueStr);
Func< T, bool > function = (Func< T, bool >)Expression.Lambda(call, new[] { predParam }).Compile();
return new Predicate<T>(function);
}
然後調用在接口上這樣的功能:
var dataGridItem = dataGrid.Items[0];
dataGrid1.Filter = Class_X.GetPredicate(columnRefName,textBox.Text,dataGridItem,tableRefName);
但通用的方法是拋出異常說類型T是「對象」的類型,即使objSource是Model.TableName的類型。
我讀了一些教程,說T不能在運行時解決,那麼我應該使用「動態」而不是泛型。
我已經嘗試過使用「動態」類型,但在將Lambda表達式投射到Func < dynamic,bool>時出現異常。說我無法從< Model.TableName,bool>轉換爲< System.Object,bool>。
是否有一種更簡單的方法來過濾由反射填充的數據網格?
這就是問題所在,對「T」型是在方法調用類型的對象,但objSource變量的類型模式.Tablename ...類型T cou ld在運行時不能解析,所以我不能創建lambda func(因爲它將使用Model.Tablename的列來對lambda執行Contains(「text」))... –
@ RafaelA.M.S。更改了代碼... – xanatos
@ RafaelA.M.S。重新更改了代碼...最後找到了您正在使用的「Filter」:http://msdn.microsoft.com/it-it/library/system.componentmodel.icollectionview.filter.aspx,它是一個「Predicate