【发布时间】:2017-02-11 12:41:01
【问题描述】:
我需要修改数据网格,使每个列标题都有一个文本框、组合框和复选框,并且所有这些都必须绑定到一个属性。我花了很多时间尝试使用默认的 DataGrid 来实现这一点,但我认为这是不可能的,所以我决定创建一个自定义 DataGrid。
到目前为止,我有一个存储DataTable 的可绑定属性BindableColumns,所以我有了需要显示的数据。问题是我不知道如何将该数据传递给OnAutoGeneratedColumns,所以我可以将列添加到DataGrid 的Columns 属性。
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);
}
【问题讨论】:
标签: c# wpf xaml datagrid dependency-properties