【问题标题】:gridview column width doesn't fits to the column contentsgridview 列宽不适合列内容
【发布时间】:2017-03-20 18:39:49
【问题描述】:

我有一个listview 和一个gridview。我希望gridview 中的一列的列标题为空,但其他列有它们的标题。但是当我为那个GridViewColumn 设置header="" 时,该列的宽度会缩小以适应空列标题的宽度,因此该列变得不可见。我为该列测试了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(); }
}

谢谢

【问题讨论】:

  • 在此处添加一些 xaml。
  • 在像&lt;GridViewColumn DisplayMemberBinding="{Binding Path=Country}" /&gt; 这样的简单示例中,列自动具有其内容的宽度!此外,如果设置了width="auto"Header=""。你最好从简单的例子开始,或者提供一些代码!

标签: wpf listview datagrid


【解决方案1】:

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

您可以使用一个简单的技巧来解决此问题,即为您的 Binding 定义一个 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 的宽度。

【讨论】:

    【解决方案2】:

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

    这里的问题是TextBlock 的宽度在绑定被解决并且列已经被渲染之前是未知的。

    解决此问题的方法是处理TextBlockLoaded 事件并显式设置列的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;
        }
    }
    

    <ListView x:Name="lv">
        <ListView.Resources>
            <local:IndexConverter x:Key="IndexConverter" />
        </ListView.Resources>
        <ListView.View>
            <GridView x:Name="gv">
                <GridView.Columns>
                    <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" Tag="0" Loaded="TextBlock_Loaded" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2017-08-08
      • 2019-05-10
      相关资源
      最近更新 更多