【问题标题】:WPF Datagrid Column Width IssueWPF Datagrid 列宽问题
【发布时间】:2013-05-12 07:17:18
【问题描述】:

DataGrid 中的列由 ObservableCollection 设置,这是我创建的简单数据对象的类型。第一列的宽度设置为“Auto”,第二列的宽度设置为“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();
    }

只有当列表长这样时才会发生这种情况吗?

【问题讨论】:

    标签: wpf datagrid width


    【解决方案1】:

    DataGrid 的TargetUpdated 在某些情况下可能不会被调用。例如,当您有更多行进入但它们不可见时,数据网格不必“浪费周期”重新渲染不可见的东西。最初的TargetUpdated 很好,但你可能需要找到一个额外的钩子,并在那里做类似的事情,比如钩入绑定到ItemsSourceItemsSource 的对象的CollectionChanged,你的@987654326 @有事件CollectionChanged,订阅并在那里尝试你的逻辑。

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      相关资源
      最近更新 更多