c# - 如何操作gridview的各个组标题

标签 c# gridview windows-8 windows-store-apps winrt-xaml

以下场景:

我使用 GridView 来呈现分组数据。

我在标题模板中添加了一个 TextBlock,
应包含该组中的项目数。 (举例)

(编辑:在我的场景中,我始终显示 6 个项目,并希望在 HeaderTemplate 的 TextBlock 子级中显示溢出)

如何从代码访问各个组标题来操作此 TextBlock?

以下是结果示例:

Example Output

这是我的 GroupHeaderTemplate 的简化示例:

<GroupStyle.HeaderTemplate>
   <DataTemplate>
      <TextBlock x:name="overflow"/>
   </DataTemplate>
</GroupStyle.HeaderTemplate>

所以我想为每个生成的组单独访问和操作“溢出”项目!

最佳答案

这就是你真正想要的。

首先编辑 GroupStyle HeaderTemplate

<GridView.GroupStyle>
    <GroupStyle HidesIfEmpty="True">
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <Grid Width="500" Margin="5,0,0,5">
                    <TextBlock HorizontalAlignment="Left">
                        <Run Text="{Binding Name}" />
                        <Run FontFamily="Segoe Ui Symbol" Text="" />
                    </TextBlock>
                    <TextBlock HorizontalAlignment="Right">
                        <Run Text="{Binding Children.Count, FallbackValue=0}" />
                        <Run Text="Items" />
                    </TextBlock>
                </Grid>
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
        <GroupStyle.Panel>
            <ItemsPanelTemplate>
                <VariableSizedWrapGrid />
            </ItemsPanelTemplate>
        </GroupStyle.Panel>
    </GroupStyle>
</GridView.GroupStyle>

please note I am using a VaraibleSizedWrapGrid

接下来,处理 GridView 的 Loaded 事件

class SubtractConverter : IValueConverter
{
    public double Amount { get; set; }
    public object Convert(object v, Type t, object p, string l)
    { return System.Convert.ToDouble(v) - Amount; }
    public object ConvertBack(object v, Type t, object p, string l)
    { throw new NotImplementedException(); }
}

private void GridView_OnLayoutUpdated(object sender, RoutedEventArgs e)
{
    var grid = sender as GridView;
    var converter = new SubtractConverter { Amount = 5 * 2 /* padding x2 */ };
    foreach (GroupItem group in (grid.ItemsPanelRoot as Panel).Children)
    {
        var result = VisualTreeHelper.GetChild(group, 0);
        while (!(result is Grid))
            result = VisualTreeHelper.GetChild(result, 0);
        var items = (result as Panel).Children.OfType<ItemsControl>()
            .First().ItemsPanelRoot;
        var binding = new Binding
        {
            Path = new PropertyPath("ActualWidth"),
            Mode = BindingMode.OneWay,
            Converter = converter,
            Source = items,
        };
        var header = (result as Panel).Children.OfType<ContentControl>()
            .First().ContentTemplateRoot as FrameworkElement;
        header.SetBinding(FrameworkElement.WidthProperty, binding);
    }
}

而且,很快!现在,您的标题大小已完美适合组中项目的宽度。

要记住的事情(作为设计师):

  1. 您分组的项目可能会窄至单列。使用标题 TextBox 中的 TextTrimming 解决此问题。
  2. 您分组的项目可能比显示器宽,并且 # 个项目可能超出屏幕。使用包含的网格上的 MinWidth 来解决此问题。

祝你好运!

关于c# - 如何操作gridview的各个组标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14499128/

相关文章:

c# - 为什么返回 String.Length 而不是 DataSource 中的实际值

c# - 我可以使用 Roslyn 来完成此 C# 语法转换吗?

java - Arraylist 将最后一个元素读取为倒数第二个元素

c++ - 如何检测是否在 Windows Metro 应用程序进程中运行?

c# - Windows 应用商店应用程序崩溃、质量报告和 CEIP

c# - 是从应用程序代码良好设计中抛出 OutOfMemoryException

c# - 覆盖方法以更改返回类型

c# - Asp.net Gridview - 为什么 DataRowBound 更改在排序时丢失?

android - 带有 AlphabetIndexer 的 gridview

c# - 带有可见可点击控件的透明表单