WPF Datagrid无法正确显示数据,但在单击列标题时正确显示

时间:2012-06-25 11:36:19

标签: c# .net wpf wpfdatagrid

我的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()。但问题仍然存在。

enter image description here

enter image description here

当我点击任何ColumnHeader时,数据会正确对齐。

enter image description here

enter image description here

这个问题可能是什么原因和解决方案?

1 个答案:

答案 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并且它工作正常;希望这对你有用。