各列ヘッダーにテキストボックス、コンボボックス、チェックボックスがあり、それらすべてをプロパティにバインドする必要があるように、DataGridを変更する必要があります。私はデフォルトのDataGridでこれを実装しようと多くの時間を費やしましたが、これは可能ではないと思いますのでカスタムDataGridを作成することにしました。カスタムデータグリッド列をバインドする方法
これまでのところ、バインド可能なプロパティBindableColumns
にはDataTable
が格納されているため、表示する必要があるデータがあります。問題は、そのデータをOnAutoGeneratedColumns
に渡す方法がわからないため、Columns
プロパティに列を追加できます。DataGrid
です。
public class BindableGrid : DataGrid
{
public DataTable BindableColumns
{
get { return (DataTable)GetValue(BindableColumnsProperty); }
set { SetValue(BindableColumnsProperty, value); }
}
public static readonly DependencyProperty BindableColumnsProperty =
DependencyProperty.Register("BindableColumns", typeof(DataTable), typeof(BindableGrid), new PropertyMetadata(null, BindableColumnsPropertyChanged));
private static void BindableColumnsPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
// This is where I get DataTable after binding
}
protected override void OnAutoGeneratedColumns(EventArgs e)
{
// This is where I need the DataTable to generate columns.
// I don't know how to invoke this method myself.
Columns.Add(new DataGridTemplateColumn
{
Header = "Test1",
HeaderTemplate = new DataTemplate()
});
}
}
とXAML:
<controls:BindableGrid ItemsSource="{Binding Data}" BindableColumns="{Binding Data}" AutoGenerateColumns="True">
</controls:BindableGrid>
編集:私は働いている列を@Raminする
感謝。 DataGrid
は列のバインディングとまったく同じ変数名を持つ行としてクラスを期待しているので、行を動的に追加するのにはいくつか問題がありました。問題を持つ人のために、ここで私はそれを解決方法は次のとおりです。
for (var rowIndex = 0; rowIndex < data.Rows.Count; rowIndex++)
{
dynamic row = new ExpandoObject();
for (var i = 0; i < data.Columns.Count; i++)
// Create variables named after bindings, and assign values
((IDictionary<string, object>)row)[data.Columns[i].ColumnName.Replace(' ', '_')] = data.Rows[rowIndex].ItemArray[i];
// Add row to DataGrid
dg.Items.Add(row);
}
これは列の配列に対して機能しますか?私は自分のDataTableにいくつの列があるのか分からないからです。私はユーザが 'DataTable'に変換されるcsvファイルを読み込ませるようにしたので、各ファイルのカラム数は異なります。 – FCin
編集された部分を参照してください。 – Ron
私はほとんどそれを動作させましたが、バインディングのために動的に行を追加することはできません。 'dg.Items.Add();'では、バインディングと同じ名前のプロパティを持つオブジェクトが必要ですが、C#では動的にクラスを作成することはできません。 – FCin