我有一个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(); }
}
由于
答案 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;
}
}