gridview列宽度不适合列内容

时间:2017-03-20 18:39:50

标签: wpf listview datagrid

我有一个listview和一个gridview。我希望gridview中某列的列标题为空,但其他列的标题为空。但是当我为header=""设置GridViewColumn时,该列的宽度会缩小以适合空列的标题的宽度,因此该列变为不可见。我为该列测试了width="auto",但它不起作用。如何强制此列根据其单元格的宽度设置其宽度,而不是其标题?

其标题应为空的列:

<GridViewColumn>
    <GridViewColumn.Header>
        <GridViewColumnHeader Padding="2,2,2,0" VerticalContentAlignment="Bottom" ClickMode="Press" />
        </GridViewColumn.Header>
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Converter={StaticResource IndexConverter}}" FontWeight="Bold" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

转换器:

public class IndexConverter : IValueConverter
{
    public object Convert(object value, Type TargetType, object parameter, CultureInfo culture)
    {
        ListViewItem item = (ListViewItem)value;
        ListView listView = ItemsControl.ItemsControlFromItemContainer(item) as ListView;
        int index = listView.ItemContainerGenerator.IndexFromContainer(item) + 1;
        return index.ToString();
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return new object(); }
}

由于

2 个答案:

答案 0 :(得分:0)

问题是,列在渲染后加载其内容。然后,不再计算列的初始自动宽度。因此,当您的网格加载标题并且cellcontents为空时。然后将初始宽度计算为零。

您可以使用一个简单的技巧通过为绑定定义FallbackValue来解决此问题。

<GridViewColumn>
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Converter={StaticResource IndexConverter}, FallbackValue='123'}" FontWeight="Bold" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

现在,您的ColumnWidth最初扩展为123的宽度。

答案 1 :(得分:0)

  

如何强制此列根据其单元格的宽度设置其宽度,而不是其标题?

这里的问题是,在解析绑定之前,TextBlock的宽度是未知的,然后该列已经被渲染。

您可以解决的问题是处理Loaded的{​​{1}}事件并明确设置列的TextBlock。您可以使用Width属性指定要调整大小的列的索引:

Tag
private void TextBlock_Loaded(object sender, RoutedEventArgs e)
{
    TextBlock tb = sender as TextBlock;
    int index;
    if (tb != null && tb.Tag != null && int.TryParse(tb.Tag.ToString(), out index) && gv.Columns.Count > index)
    {
        gv.Columns[index].Width = tb.ActualWidth + 12;
    }
}