WPF で DataGrid にフィルターを適用しようとしていますが、フィルター プロパティには Predicate が必要です
元:
dataGrid1.Filter = p => p.A_Field_Table1.Contains(textBox.Text);
しかし、私のデータグリッドはリフレクションで満たされているため、実行時にデータグリッド内のオブジェクトのタイプしか知りません。
次に、 Predicate< 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);
しかし、ジェネリック メソッドは、objSource が Model.TableName の型であっても、型 T が「オブジェクト」の型であるという例外をスローしています。
実行時に T を解決できないというチュートリアルを読んだので、ジェネリック型の代わりに「動的」を使用する必要があります。
「動的」タイプを使用してみましたが、Lambda 式を Func<dynamic, bool> にキャストしているときに例外が発生します。< Model.TableName , bool > から < System.Object , bool > に変換できないと言っています。
リフレクションで満たされたデータグリッドをフィルタリングする簡単な方法はありますか?