リフレクション(methodDefinition.Invoke(..))によってitemsSourceを埋めるデータグリッドを使用している場合、ターゲットメソッドはIQueryable <T>を返します。Tは実行時に既知のEntityTypeです。
戻り値の型はIQueryable <T>であり、これを行うとIQueryable <T>はIEnumerableを実装するためです。
dataGrid1.ItemsSource = methodQuery.Invoke(instance, parameters) as IEnumerable<object>;
行と列を確認することはできませんが(さらにAutoGeneratingColumnsイベントがスローされるため、列を管理できます)、ヘッダーをクリックして行を並べ替えることはできません。
それから私はこれをやろうとしました:
dataGrid1.ItemsSource = methodQuery.Invoke(instance, parameters) as List<object>;
しかし、予想どおり、「Model.Tab_001」から「object」に汎用型を直接キャストできないという例外がスローされます。
また、実行時に結果をList <T>に変換しようとしました(IEnumerable.ToList()の拡張により、ソースをList <T>に変換する関数を実装するデリゲートを作成しました)が、Tはランタイムとオブジェクト(methodDefinition.invokeから返される)は、このメソッドを使用する前に、タイプTの明示的な宣言なしに拡張子.ToList()を使用することはできません。
@edit:同じIEnumerable <オブジェクト>(datagridで動作している)とToList()拡張メソッドでこのメソッドを使用すると、datagridは空白行で埋められ、AutoGeneratingColumnsが起動されません。したがって、結果を見ることができず、空白行でいっぱいのdataGridだけです。
また、結果をObservableCollectionに変換しようとしましたが、リストで同じ問題が発生しました。
データグリッドのItemsSoureとしてリストを使用する横の列ヘッダーをクリックして、データグリッドの行を並べ替える別の方法はありますか?
私はそれを行うためのより簡単な方法を見つけました。
dataGridをAutoGenerateColumnsに設定する代わりに、プロパティ通知機能をdataGridのItemsSourceに設定し、IEnumerable <object>への直接キャストで埋めてからToList()拡張機能を使用しました。
データソースが変更されるたびに、適切なヘッダーとバインディングを使用して列を手動で追加します。
これで、列ヘッダーをクリックして行を並べ替えることができます。
コード:
...
dataGrid1.ItemsSource = (IEnumerable<object>)methodQuery.Invoke(instance, parameters).ToList();
...
..。
private void DataGridItemsSourceChanged(object sender, EventArgs e)
{
var currentDataGrid = (DataGrid)sender;
foreach (TSpe_Reg reg in tabItemSourceChange.TSpe_Reg) // tabItemSourceChange is used to check the table and field names, since im using reflection.
{
string headerName = "";
if (reg.a_short_name != "")
headerName = reg.a_short_name;
else
headerName = reg.a_full_name;
string boundColumn = "a_" + reg.a_field_name + "_" + tabItemSourceChange.a_table_name;
DataGridTextColumn ColumnDataGrid = new DataGridTextColumn { Header = headerName, Binding = new Binding(boundColumn) };
}
}
// Calls the DataGridItemsSourceChanged whenever the DependencyProperty ItemsSource is changed.
private void CallItemSourcePropertyDescriptor(DataGrid currentDataGrid)
{
var dpd = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(DataGrid));
if (dpd != null)
{
dpd.AddValueChanged(currentDataGrid, DataGridItemsSourceChanged);
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加