尝试跨数据模板调整列时,我遇到了一些奇怪的行为。
背景:
我有一个外部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;
}
}
}
}
现在,当我尝试以任意少量调整列的大小时,它会被大量调整大小。作为样本:
答案 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
的大小。