Ширина столбца GridView не обновляется при изменении ItemsSource - PullRequest
2 голосов
/ 31 января 2012

У меня есть 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>

Ответы [ 2 ]

8 голосов
/ 01 февраля 2012

Используйте этот код после обновления 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 голосов
/ 01 апреля 2013

Я создал следующий класс и использовал его во всех приложениях вместо 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);
    }
}
...