2013-05-17 154 views
3

我有中的列由ObservableCollection设置,它是我创建的简单数据对象的类型。第一列的宽度设置为“自动”,第二列的宽度设置为“1 *”。WPF Datagrid列宽问题

我目前在回答here中使用该方法来自动更新我的列的宽度,当ItemsSource更改时,该列的宽度设置为“自动”。这似乎工作的大部分时间:

enter image description here 这看起来不错,和所有工作的时间

虽然,当ItemsSource有点大(可以说约30-35条记录)时, “自动” 宽度(第一)列将收缩向下DataGrid(包括滚动条)是点击

enter image description here这将是适当的调整,如果没有被点击它

我的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(); 
    } 

是有没有什么理由可能会发生,只有当名单更长这样?

回答

1

DataGrid的TargetUpdated可能无法在几种情况下调用。例如,当你有更多的行进入,但它们不可见时,那么数据网格不必“重复循环”来重新渲染不可见的东西。最初的TargetUpdated没问题,但您可能必须找到一个额外的挂钩,并在那里执行类似的操作,例如挂钩到您的datagridItemsSource的对象CollectionChangedobservableCollection有事件CollectionChanged,请订阅并尝试那里的逻辑。