WPF DataGrid 列宽和重新排序
Posted
技术标签:
【中文标题】WPF DataGrid 列宽和重新排序【英文标题】:WPF DataGrid column widths and reordering 【发布时间】:2010-11-17 13:50:57 【问题描述】:我有一个 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】:列在列集合中的位置没有改变。只有 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);
【讨论】:
以上是关于WPF DataGrid 列宽和重新排序的主要内容,如果未能解决你的问题,请参考以下文章