2012-01-31 62 views
2

我有一個GridView,我在代碼隱藏中設置ItemsSource。網格中的所有列都在XAML中定義,並且所有列寬均爲「自動」。當我最初設置網格的ItemsSource時,列的寬度設置正確。當更改ItemsSource時GridView列的寬度不會更新

現在,根據用戶的操作,網格的ItemsSource可能被設置爲一個新的EntityCollection。我注意到的是,列寬保持與之前的ItemsSource一樣。也就是說,當爲網格設置新的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> 
+1

你試圖迫使' 'GridView'上的UpdateLayout()'?它可能是它本身,但以防萬一, – 2012-01-31 12:22:38

+0

我已經嘗試過,但它並沒有幫助 – Igal 2012-01-31 12:36:33

回答

6

使用此代碼更新後的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; 
     } 
    } 
} 
1

我已經創建了下面的類,並在應用程序中使用等。無論需要到位的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); 
    } 
}