3

DataGrid我的wpf 应用程序中有一个

<DataGrid Name="datagrid2" ItemSource="{Binding}" CanUserReorderColumns="False" 
          IsReadOnly="True" SelectionMode="Single" CanUserResizeColumns="False" 
          CanUserResizeRows="False" LoadingRow="datagrid2_LoadingRow" />

我将其提供ItemSource

datagrid2.ItemSource = mydatatable.DefaultView;

及其行头为

private void datagrid2_LoadingRow(object sender, DataGridRowEventArgs e)
{
    e.Row.Header = Some_string_araay[e.Row.GetIndex()];
}

有时我的问题是行标题成为第一列的数据。因此,最后一列及其数据变为无标题。我认为这是一个布局问题,所以在提供后ItemSourceLoadingRow做了datagrid2.UpdateLayout(). 但问题仍然存在。

在此处输入图像描述

在此处输入图像描述

当我单击 anyColumnHeader时,数据会正确对齐。

在此处输入图像描述

在此处输入图像描述

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

4

1 回答 1

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 个单元格数据更改第一列的宽度,它工作正常;希望这对你有用。

于 2012-06-25T12:20:58.573 回答