2016-05-31 84 views
1

當我嘗試跨數據模板調整列大小時,我遇到了一些奇怪的行爲。爲GridViewColumn調整大小正在做奇怪的事情

背景:

我有一個外ListView這勢必一組類別。然後我有一個內部的ListView,我認爲它有一個GridView。 現在我已經將GridViewColumn寬度綁定到GridViewColumnHeader,以便相應地調整GridViewColumns

示例代碼:

<ListView ItemsSource="{Binding Categories, Mode=TwoWay}"> 
    <ListView.ItemTemplate> 
    <DataTemplate> 
     <Expander Header="{Binding Description}"> 
     <ListView ItemsSource="{Binding Items}"> 
      <ListView.View> 
      <GridView> 
       <!-- Description column --> 
       <GridViewColumn Width="{Binding ElementName=DescriptionCol, Path=Width}"> 
       <GridViewColumn.Header> 
        <GridViewColumnHeader Name="DescriptionCol" Content="Description" 
             SizeChanged="Description_Column_SizeChanged" 
             HorizontalContentAlignment="Left" 
             Loaded="Description_Column_Loaded"> 
        </GridViewColumnHeader> 
       </GridViewColumn.Header> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
        <TextBlock Name="DescriptionTextBlock" Text="{Binding Description}" 
           Style="{StaticResource TextBlock_GridEntries_Style}" 
           Margin="{Binding HierarchyLevel, Mode=OneWay, Converter={StaticResource HierarchyToMarginConverter}}"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
      </ListView.View> 
     </ListView> 
     </Expander> 
    </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

現在我試圖通過捕獲GridViewColumnHeaders對象並將其存儲在一個特殊的GridViewColumnCommunal對象綁定跨類別列寬。

private GridViewColumnCommunal descriptionColumns = new GridViewColumnCommunal(); 

private void Description_Column_Loaded(object sender, RoutedEventArgs e) 
{ 
    var gridViewColHeader = sender as GridViewColumnHeader; 
    if (descriptionColumns != null) 
    { 
     descriptionColumns.AddColumnToListAndResize(gridViewColHeader); 
    } 
} 

GridViewColumnCommunal類:

public class GridViewColumnCommunal 
{ 
    private List<GridViewColumnHeader> _columns = new List<GridViewColumnHeader>(); 

    public List<GridViewColumnHeader> Columns 
    { 
     get { return _columns; } 
     set { _columns = value; } 
    } 

    public void UpdateColumnsItemsWithLargestColumnWidth() 
    { 
     if (Columns != null) 
     { 
      var maxWidth = Columns.Max(x => x.ActualWidth); 
      foreach (var column in Columns) 
      { 
       column.Width = maxWidth; 
      } 
     } 
    } 

    public void AddColumnToListAndResize(GridViewColumnHeader columnToAdd) 
    { 
     if (columnToAdd != null && Columns != null && !Columns.Contains(columnToAdd)) 
     { 
      Columns.Add(columnToAdd); 
      UpdateColumnsItemsWithLargestColumnWidth(); 
     } 
    } 

    public void UpdateColumnsWithNewWidth(Size size) 
    { 
     if (Columns != null) 
     { 
      foreach (var column in Columns) 
      { 
       column.Width = size.Width; 
      } 
     } 
    } 
} 

現在,當我嘗試調整任何少量列,它就會通過一個顯著量調整。作爲一個樣本:

前:
Before image

後:
Afterimage

回答

1

嘗試改變像下面的方法UpdateColumnsItemsWithLargestColumnWidth

public void UpdateColumnsItemsWithLargestColumnWidth() 
    { 
     if (Columns != null) 
     { 
      var maxColumn =Columns.First(y=>y.Column.ActualWidth == Columns.Max(x => x.Column.ActualWidth)); 
      foreach (var column in Columns) 
      {      
       column.Column.Width = maxColumn.Column.ActualWidth; 
      } 
     } 
    } 

當你想調整ColumnWidth。如果您只設置GridViewColumnHeaderWidth它可能不強制整列Width。但是,如果您設置了ColumnWidth它也將調整GridViewColumnHeaderWidth

+0

你是一個絕對的傳說。這已經解決了這個問題! –

+0

@blake_griffin我知道...:D ... lol :)謝謝 –