3

次のように定義された 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>

ロード時に見栄えがします。最初の列は、コンテンツとヘッダーの両方を収めるのに必要な最小幅に収まります。2 番目の列は、DataGrid の残りの幅を埋めるために伸びます (したがって、3 番目のフィラー列はありません)。しかし、列を並べ替えようとすると、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);
            }
        }
    }

列の幅を処理するより良い方法はありますか? また、列の並べ替えによって列のサイズ変更機能が損なわれるのはなぜですか?

4

1 に答える 1

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);
            }
        } 
    }
于 2011-03-08T02:16:52.350 に答える