WPF DataGrid列宽和重新排序

时间:2009-08-07 02:46:47

标签: wpf xaml datagrid wpfdatagrid column-width

我将DataGrid定义为

<wpftoolkit:DataGrid
        x:Name="AccountsDataGrid"
        AutoGenerateColumns="False"
        ItemsSource="{Binding Path=Accounts}"
        ColumnReordered="DataGrid_ColumnReordered"
        SelectionUnit="FullRow"
        RowHeaderWidth="0"
        HorizontalAlignment="Stretch"
        VerticalAlignment="Stretch"
        >
        <wpftoolkit:DataGrid.Columns>
            <wpftoolkit:DataGridTextColumn Header="Account Id" Binding="{Binding Path=AccountId}" Width="Auto" />
            <wpftoolkit:DataGridTextColumn Header="Account Name" Binding="{Binding Path=AccountName}" Width="*" />
        </wpftoolkit:DataGrid.Columns>
    </wpftoolkit:DataGrid>

负载看起来很棒。第一列适合于适合内容和标题所需的最小宽度。第二列拉伸以填充DataGrid的其余宽度(因此我没有第三个填充列)。但是,如果我尝试重新排序列,则无法将AccountName列的大小调整为小于重新排序之前的宽度。所以我在ColumnReordered事件上添加了一个处理程序,假设我可以重置列宽,但它似乎不起作用。事实上,它将AccountId列缩小到几乎为零,而且AccountName列仍然无法调整为较小。

private void DataGrid_ColumnReordered(object sender, Microsoft.Windows.Controls.DataGridColumnEventArgs e)
    {
        foreach (DataGridColumn column in AccountsDataGrid.Columns)
        {
            if (column.Equals(AccountsDataGrid.Columns.Last()))
            {
                column.Width = new DataGridLength(1.0, DataGridLengthUnitType.Star);
            }
            else
            {
                column.Width = new DataGridLength(1.0, DataGridLengthUnitType.Auto);
            }
        }
    }

是否有更好的方法来处理列宽以及为什么列重新排序会破坏列大小调整功能

1 个答案:

答案 0 :(得分:3)

列不会更改列集合中的位置。只有DisplayIndexes正在改变。试试这个:

  private void DataGrid_ColumnReordered(object sender, DataGridColumnEventArgs e)
    {
        int lastColumnOrder = AccountsDataGrid.Columns.Count() - 1;
        foreach (DataGridColumn column in AccountsDataGrid.Columns)
        {
            if (column.DisplayIndex == lastColumnOrder)
            {
                column.Width = new DataGridLength(1.0, DataGridLengthUnitType.Star);
            }
            else
            {
                column.Width = new DataGridLength(1.0, DataGridLengthUnitType.Auto);
            }
        } 
    }