Ширина столбца GridView не обновляется при изменении ItemsSource

У меня есть GridView, где я устанавливаю ItemSource в коде. Все столбцы в сетке определены в XAML, а все ширины столбцов - "Авто". Когда я изначально устанавливаю ItemsSource в сетке, ширина столбцов устанавливается правильно.

Теперь, в зависимости от действий пользователя, ItemsSource сетки может быть установлен на новый EntityCollection. Я заметил, что ширина столбцов остается такой же, как у предыдущих элементов ItemsSource. То есть ширина столбцов, по-видимому, не настраивается автоматически, если для Grid установлен новый ItemSource. Есть ли какой-либо путь в коде или XAML, чтобы заставить сетку использовать новый ItemSource при установке ширины столбцов? Я бы подумал, что это будет то, что GridView будет делать автоматически, когда он ItemsSource reset.

<scrollviewer verticalscrollbarvisibility="Auto">
 <listview>
 <listview.view>
 <gridview>
 <gridview.columns>
 <gridviewcolumn width="Auto" header="Status">
 <gridviewcolumn.celltemplate>
 <datatemplate>
 
 </datatemplate>
 </gridviewcolumn.celltemplate>
 </gridviewcolumn>
 <gridviewcolumn width="Auto" header="Title">
 <gridviewcolumn.celltemplate>
 <datatemplate>
 <textblock texttrimming="CharacterEllipsis" text="{Binding}">
 </textblock></datatemplate>
 </gridviewcolumn.celltemplate>
 </gridviewcolumn>
 </gridview.columns>
 </gridview>
 </listview.view>
 </listview>
</scrollviewer>
2 ответа

Используйте этот код после обновления ItemsSource:

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


Я создал следующий класс и использовал его во всех приложениях вместо 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 (******.IsNaN(column.Width)) column.Width = column.ActualWidth;
 column.Width = ******.NaN; 
 } 
 base.PrepareItem(item);
 }
}

licensed under cc by-sa 3.0 with attribution.