DataGrid之后的新DataContext事件

时间:2018-04-26 07:44:40

标签: c# wpf datagrid

在我的WPF窗口中我有DataGrid DataGrid从DataTable加载数据,如:

gridData.DataContext = dataTable

一切正常,DataGrid由数据表存储过程中的数据填充。 取决于数据类型,DataGrid的列具有不同的宽度,我希望在DataGrid填充数据之后得到此宽度。 我必须处理哪个事件呢?我尝试了DataContextChangedLoadedAutoGenratedColumnsSourceUpdated - 但似乎在DataGrid被数据填充之前调用了所有这些内容。

任何解决方案?

2 个答案:

答案 0 :(得分:0)

您可以使用多种方法来捕捉DataGrid的ItemsSource更改时刻:

  1. 使用DependencyPropertyDescriptor:

        DependencyPropertyDescriptor itemsSourcePropertyDescriptor = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(DataGrid));
        itemsSourcePropertyDescriptor.AddValueChanged(dataGrid1, OnDataGridItemsSourceChanged);
    
    private void OnDataGridItemsSourceChanged(object sender, EventArgs e) {
    }
    
  2. 创建DataGrid后代并覆盖OnItemsSourceChanged方法

答案 1 :(得分:0)

没有防弹方式,因为DataGrid不会引发任何"生成的列#34;事件,但是您应该能够在加载Dispatcher.Invoke后致DispatcherPriority DispatcherPriority.Loaded低于DataGrid,例如:

dataGrid.AutoGenerateColumns = true;
dataGrid.ItemsSource = new List<Item> { new Item() { Name = "some very long name..." } };
dataGrid.Loaded += (s, e) => 
{
    dataGrid.Dispatcher.Invoke(new Action(() =>
    {
        MessageBox.Show(dataGrid.Columns[0].ActualWidth.ToString());
    }), System.Windows.Threading.DispatcherPriority.Input);
};