我的wpf应用
中有DataGrid
<DataGrid Name="datagrid2" ItemSource="{Binding}" CanUserReorderColumns="False"
IsReadOnly="True" SelectionMode="Single" CanUserResizeColumns="False"
CanUserResizeRows="False" LoadingRow="datagrid2_LoadingRow" />
我正在提供ItemSource
datagrid2.ItemSource = mydatatable.DefaultView;
和它的rowheader为
private void datagrid2_LoadingRow(object sender, DataGridRowEventArgs e)
{
e.Row.Header = Some_string_araay[e.Row.GetIndex()];
}
有时我的问题是rowheader成为第一列的数据。因此,最后一列及其数据变得无头。我认为这是一个布局问题,因此在提供ItemSource
之后,在LoadingRow
中我datagrid2.UpdateLayout()
。但问题仍然存在。
当我点击任何ColumnHeader
时,数据会正确对齐。
这个问题可能是什么原因和解决方案?
答案 0 :(得分:2)
好的,我想我知道为什么会这样。
第一列(具有行标题)宽度是在运行时根据网格加载时的内容(行标题数据)确定的。现在,在您加载网格时,您的行标题没有数据(您在LoadingRow
事件中设置标题),因此第一列的宽度设置为0;一旦更新了行标题,就不会反映出来,因为DataGrid
不会刷新自己。
点击列标题后,它会重新计算RowHeader
宽度,这次正确,因为您的行标题包含数据。
应该有一些简单的解决方案,但一种方法是将RowHeaderWidth
绑定到SelectAllButton(在0,0,单元格中),就像这样 -
// Loaded event handler for Datagrid
private void DataGridLoaded(object sender, RoutedEventArgs e)
{
datagrid2.LayoutUpdated += DataGridLayoutUpdated;
}
private void DataGridLayoutUpdated(object sender, EventArgs e)
{
// Find the selectAll button present in grid
DependencyObject dep = sender as DependencyObject;
// Navigate down the visual tree to the button
while (!(dep is Button))
{
dep = VisualTreeHelper.GetChild(dep, 0);
}
Button selectAllButton = dep as Button;
// Create & attach a RowHeaderWidth binding to selectAllButton;
// used for resizing the first(header) column
Binding keyBinding = new Binding("RowHeaderWidth");
keyBinding.Source = datagrid2;
keyBinding.Mode = BindingMode.OneWay; // Try TwoWay if OneWay doesn't work)
selectAllButton.SetBinding(WidthProperty, keyBinding);
// We don't need to do it again, Remove the handler
datagrid2.LayoutUpdated -= DataGridLayoutUpdated;
}
我已经做了类似的事情,根据第0,0个单元数据更改了第一列的widht并且它工作正常;希望这对你有用。