GridViewColumn的Resize正在做一些奇怪的事情

时间:2016-05-31 00:18:26

标签: c# wpf listview

尝试跨数据模板调整列时,我遇到了一些奇怪的行为。

背景:

我有一个外部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 个答案:

答案 0 :(得分: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;
            }
        }
    }

您想要调整Column Width的大小。如果您只设置Width GridViewColumnHeader,则可能不会强制整个列Width。但是,如果您设置Column Width,它也会调整GridViewColumnHeader Width的大小。