强制WPF DataGrid重新生成自己

时间:2011-09-29 09:58:01

标签: wpf data-binding datagrid auto-generate

我有一个继承自DataGrid的自定义控件,基本上是2D DataGrid(接受ItemsSource有两个维度,例如double[,])。

我添加了DependencyPropertyColumnHeaders的特定RowHeaders,因此我可以对其进行定义。

现在它是如何运作的:

  • 我将2D ItemsSource绑定到DataGrid
  • 包装器方法会将此源转换为可绑定到实际数据网格IEnumerable
  • 的经典ItemsSource
  • 自动生成的每一行/每列都是使用事件AutoGeneratingColumn& AutoGeneratingRow以定义其标题

这里的问题:

初始化DataGrid时,一切正常。

之后,我的应用程序的一个用例定义只有列标题可以更改(通过修改DependencyProperty ColumnHeaders

而且,无论我在这里做什么,DataGrid都不会重新自动生成其列(因此,标题不会以任何方式更改)。

那么,有没有办法问DataGrid类似“嘿,我希望你从头重新开始并重新生成列”?因为暂时我无法访问AutoGeneratingColumn事件,调用InvalidateVisual之类的方法只会重绘网格(而不是重新生成列)。

这里有什么想法吗?

我不确定我们是否需要一些代码但是...我会放一些所以没有人要求它:D

    /// <summary>
    /// IList of String containing column headers
    /// </summary>
    public static readonly DependencyProperty ColumnHeadersProperty =
        DependencyProperty.Register("ColumnHeaders",
                                    typeof(IEnumerable),
                                    typeof(FormattedDataGrid2D),
                                    new PropertyMetadata(HeadersChanged));

    /// <summary>
    /// Handler called when the binding on ItemsSource2D changed
    /// </summary>
    /// <param name="source"></param>
    /// <param name="e"></param>
    private static void ItemsSource2DPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        FormattedDataGrid2D @this = source as FormattedDataGrid2D;
        @this.OnItemsSource2DChanged(e.OldValue as IEnumerable, e.NewValue as IEnumerable);
    }

        // (in the constructor)
        AutoGeneratingColumn += new EventHandler<DataGridAutoGeneratingColumnEventArgs>(DataGrid2D_AutoGeneratingColumn);

    void DataGrid2D_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        DataGridTextColumn column = e.Column as DataGridTextColumn;
        column.Header = (ColumnHeaders == null) ? columnIndex++ : (ColumnHeaders as IList)[columnIndex++]; //Header will be the defined header OR the column number
        column.Width = new DataGridLength(1.0, DataGridLengthUnitType.Auto);
        Binding binding = column.Binding as Binding;
        binding.Path = new PropertyPath(binding.Path.Path + ".Value"); // Workaround to get a good value to display, do not take care of that
    }

2 个答案:

答案 0 :(得分:7)

重置您的ItemsSource,它应该重绘您的DataGrid

void ResetDataGrid()
{
    var temp = myDataGrid.ItemsSource;
    myDataGrid.ItemsSource = null;
    myDataGrid.ItemsSource = temp;
}

您也可以刷新绑定,但我还没有对它进行测试,看看这是否会实际重新生成DataGrid:

void ResetDataGrid()
{
    myDataGrid.GetBindingExpression(DataGrid.ItemsSourceProperty).UpdateTarget();
}

答案 1 :(得分:3)

关闭AutogeneratedColumns然后再打开将导致再次自动生成列。

dataGrid.AutoGenerateColumns = false;
dataGrid.AutoGenerateColumns = true;