如何操作gridview的各个组头

时间:2013-01-24 10:30:06

标签: 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>

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

2 个答案:

答案 0 :(得分:2)

这是你真正想要的。

首先编辑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>
  

请注意我使用的是VaraibleSizedWrapGrid

接下来,处理GridView的已加载事件

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);
    }
}

而且,presto!现在,您的标题大小完全符合组中项目的宽度。

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

  1. 您的分组项目可能与单个列一样窄。使用标题TextTrimming中的TextBox解决此问题。
  2. 您的分组项目可能比监视器宽,# items可能在屏幕外。使用包含grid
  3. 的MinWidth解决此问题

    祝你好运!

答案 1 :(得分:0)

我终于通过使用VisualTreeHelperExtensions

设法获得了所需的元素

首先,你必须通过Nuget安装XamlToolkit

然后为Extensions添加using指令:

using WinRTXamlToolkit.Controls.Extensions;

现在你可以在你的ui元素上使用更多的方法,其中一个是getDescendantsByType() 我用来获取我的gridview所有文本块元素。我在溢出的文本块中添加了一个标记,我在遍历gridviews后代时检查它,看看你自己:

    private void ItemsGridView_Loaded(object sender, RoutedEventArgs e)
    {
        foreach (TextBlock element in this.myGridView.GetDescendantsOfType<TextBlock>())
        {
            if(element.Tag != null && element.Tag.Equals("itemCountBlock")){
                element.Text = "Finally solved!";
            }
        }
    }

这应该适用于任何ui元素和任何想要改变的属性。