2012-01-31 2 views
2

코드 숨김으로 ItemsSource를 설정하는 GridView가 있습니다. 모눈의 모든 열은 XAML에 정의되며 모든 열 너비는 "자동"입니다. 처음에 격자의 ItemsSource를 설정하면 열 너비가 올바르게 설정됩니다.ItemsSource를 변경할 때 GridView 열 너비가 업데이트되지 않습니다.

이제 사용자의 동작에 따라 그리드의 ItemsSource를 새 EntityCollection으로 설정할 수 있습니다. 주목해야 할 것은 이전 ItemsSource 에서처럼 열 너비가 유지된다는 것입니다. 즉, 새 ItemsSource가 Grid에 설정되면 열 너비가 자동으로 조정되지 않는 것처럼 보입니다. 열 너비를 설정할 때 Grid가 새 ItemsSource를 사용하도록 코드 숨김 또는 XAML에 어떤 방법이 있습니까? 나는 이것이 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

당신이 강제로 시도 않았다' UpdateLayout()'GridView'에? 그것은 아마도 그 자체를하지만, 단지의 경우 –

+0

나는 이미 시도했지만 도움이되지 않습니다. – Igal

답변

6

사용이 코드 ItemsSource 업데이트 한 후 :의 GridView의 장소에서 필요한 whereever 나는 다음과 같은 클래스를 생성하고 응용 프로그램에 걸쳐 사용했다

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

/// <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); 
    } 
} 
관련 문제