gpt4 book ai didi

wpf - 强制 WPF DataGrid 重新生成自身

转载 作者:行者123 更新时间:2023-12-04 11:13:55 27 4
gpt4 key购买 nike

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

我添加了一个特定的 DependencyProperty这是ColumnHeadersRowHeaders所以我可以定义它们。

这是它现在的工作方式:

  • 我绑定(bind)了一个 2D ItemsSourceDataGrid
  • 包装器方法将使用此源将其转换为经典 IEnumerable可绑定(bind)到实际数据网格的 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
    }

    最佳答案

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

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

    您也许还可以刷新绑定(bind),但我还没有测试它是否真的会重新生成 DataGrid:
    void ResetDataGrid()
    {
    myDataGrid.GetBindingExpression(DataGrid.ItemsSourceProperty).UpdateTarget();
    }

    关于wpf - 强制 WPF DataGrid 重新生成自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7595583/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com