2016-05-31 8 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オブジェクトに格納することでカテゴリー間で列の幅をバインドしようとしています。 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); 
    } 
} 

:今

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; 
      } 
     } 
    } 

サイズを変更するとColumnWidthWidthのみをGridViewColumnHeaderに設定すると、列全体が強制的に実行されない場合があります。Widthしかし、ColumnWidthを設定すると、GridViewColumnHeaderWidthのサイズも変更されます。

+0

あなたは絶対的な伝説です。これで問題は解決しました。 –

+0

@blake_griffin知っている...:D ...笑:)ありがとう –

関連する問題