【问题标题】:GridView column width does not update when changing ItemsSource更改 ItemsSource 时,GridView 列宽不更新
【发布时间】:2012-01-31 11:38:41
【问题描述】:

我有一个 GridView,我在其中在代码隐藏中设置 ItemsSource。网格中的所有列都在 XAML 中定义,所有列宽都是“自动”。当我最初设置网格的 ItemsSource 时,列宽设置正确。

现在,根据用户的操作,网格的 ItemsSource 可能会设置为新的 EntityCollection。我注意到的是,列宽与之前的 ItemsSource 保持一致。也就是说,当为 Grid 设置新的 ItemsSource 时,列宽似乎不会自动调整。代码隐藏或 XAML 中是否有任何方法可以强制 Grid 在设置列宽时使用新的 ItemsSource?我认为这将是 GridView 在重置 ItemsSource 时会自动执行的操作。

<ScrollViewer VerticalScrollBarVisibility="Auto">
    <ListView>
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Width="Auto" Header="Status">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Image Width="16" Height="16" Source="{Binding Path=Blocking}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Width="Auto" Header="Title">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock TextTrimming="CharacterEllipsis" Text="{Binding}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
</ScrollViewer>

【问题讨论】:

  • 您是否尝试在 GridView 上强制使用 UpdateLayout() ?它可能会自己做,但以防万一,
  • 我已经试过了,但是没有用

标签: wpf xaml gridview binding itemssource


【解决方案1】:

在更新 ItemsSource 后使用此代码:

public void AutoSizeGridViewColumns(ListView listView) 
{ 
    GridView gridView = listView.View as GridView; 
    if (gridView != null)
    { 
        foreach (var column in gridView.Columns)
        {
            if (double.IsNaN(column.Width))
                column.Width = column.ActualWidth; 
            column.Width = double.NaN; 
        } 
    } 
} 

【讨论】:

    【解决方案2】:

    我创建了以下类,并在需要时在应用程序中使用以代替 GridView

    /// <summary>
    /// Represents a view mode that displays data items in columns for a System.Windows.Controls.ListView control with auto sized columns based on the column content     
    /// </summary>
    public class AutoSizedGridView : GridView
    {        
        protected override void PrepareItem(ListViewItem item)
        {
            foreach (GridViewColumn  column in Columns)
            {
                //setting NaN for the column width automatically determines the required width enough to hold the content completely.
                //if column width was set to NaN already, set it ActualWidth temporarily and set to NaN. This raises the property change event and re computes the width.
                if (double.IsNaN(column.Width)) column.Width = column.ActualWidth;
                column.Width = double.NaN;              
            }            
            base.PrepareItem(item);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 2011-10-26
      • 2021-09-26
      • 2012-06-22
      • 2019-03-18
      • 1970-01-01
      相关资源
      最近更新 更多