在我的WPF窗口中我有DataGrid
DataGrid
从DataTable加载数据,如:
gridData.DataContext = dataTable
一切正常,DataGrid
由数据表存储过程中的数据填充。
取决于数据类型,DataGrid的列具有不同的宽度,我希望在DataGrid填充数据之后得到此宽度。
我必须处理哪个事件呢?我尝试了DataContextChanged
,Loaded
,AutoGenratedColumns
,SourceUpdated
- 但似乎在DataGrid
被数据填充之前调用了所有这些内容。
任何解决方案?
答案 0 :(得分:0)
您可以使用多种方法来捕捉DataGrid的ItemsSource更改时刻:
使用DependencyPropertyDescriptor:
DependencyPropertyDescriptor itemsSourcePropertyDescriptor = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(DataGrid));
itemsSourcePropertyDescriptor.AddValueChanged(dataGrid1, OnDataGridItemsSourceChanged);
private void OnDataGridItemsSourceChanged(object sender, EventArgs e) {
}
创建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);
};