我在DataGrid
中的列由ObservableCollection
设置,这是我创建的简单数据对象的类型。第一列的宽度设置为“自动”,第二列的宽度设置为“ 1 * ”。
我目前正在使用答案here中的方法来自动更新ItemsSource
更改时设置为“自动”的列宽度。这似乎在大多数时间都有效:
这看起来很棒,并且一直有效
虽然当ItemsSource
略大一些时(比如大约30-35条记录),“自动”宽度(第一列)将缩小 仅 当DataGrid
(包括滚动条)点击时:
如果尚未点击,则会正确调整大小
我的XAML看起来像这样:
<my:DataGrid CanUserSortColumns="false" CanUserResizeRows="false" CanUserResizeColumns="false" CanUserReorderColumns="false" CanUserDeleteRows="false" CanUserAddRows="false" AutoGenerateColumns ="False" SelectionMode="Single" SelectionUnit="Cell" Height="113" HorizontalAlignment="Left" Margin="11,22,0,0" Name="dataGrid" VerticalAlignment="Top" Width="226" Background="#FFE2E2E2" AlternatingRowBackground="#FFA4CFF2" BorderBrush="#FF7C7C7C" HorizontalGridLinesBrush="White" PreviewKeyDown="dataGrid_PreviewKeyDown" CellEditEnding="dataGrid_CellEditEnding" BeginningEdit="dataGrid_BeginningEdit" PreparingCellForEdit="dataGrid_PreparingCellForEdit" SelectedCellsChanged="dataGrid_SelectedCellsChanged" Loaded="dataGrid_Loaded" TargetUpdated="dataGrid_TargetUpdated">
<my:DataGrid.Columns>
<my:DataGridTextColumn Binding="{Binding Path=Name, NotifyOnTargetUpdated=True}" Width="Auto">
<my:DataGridTextColumn.CellStyle>
<Style TargetType="{x:Type my:DataGridCell}">
<Setter Property="KeyboardNavigation.IsTabStop" Value="False"></Setter>
<Setter Property="IsHitTestVisible" Value="False"></Setter>
<Setter Property="Focusable" Value="False"></Setter>
<Setter Property="Background" Value="WhiteSmoke"></Setter>
<Setter Property="BorderBrush" Value="LightGray"></Setter>
</Style>
</my:DataGridTextColumn.CellStyle>
</my:DataGridTextColumn>
<my:DataGridTextColumn Binding="{Binding Path=Value}" Width="1*"></my:DataGridTextColumn>
</my:DataGrid.Columns>
</my:DataGrid>
确保更新列的代码:
private void dataGrid_TargetUpdated(object sender, DataTransferEventArgs e)
{
dataGrid.Columns[0].Width = 0;
dataGrid.UpdateLayout();
dataGrid.Columns[0].Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
dataGrid.UpdateLayout();
}
只有当列表长得像这样时才会出现这种情况吗?
答案 0 :(得分:1)
TargetUpdated
TargetUpdated
。例如,当你有更多的行进入但它们不可见时,那么数据网格就不会在&#34;上浪费周期。重新渲染不可见的东西。最初的CollectionChanged
很好,但你可能必须找到一个额外的钩子,并在那里做类似的事情,比如挂钩到ItemsSource
绑定到datagrid
的对象在您的observableCollection
中,您的CollectionChanged
有活动{{1}},订阅并在那里尝试您的逻辑。