【问题标题】:Can ItemsControl group the bound collection?ItemsControl 可以对绑定的集合进行分组吗?
【发布时间】:2012-01-25 22:51:50
【问题描述】:

我正在尝试确定是否有一种方法可以使用 ItemsControl 将 ItemsSource 中的项目分组到单独的 ItemsPanel 中。具体来说,我正在尝试创建一个视图,以便可以以网格类型的方式列出 8 个项目的集合,例如 UniformGrid,但结果是均匀的,而不是空单元格。

虽然源中有 8 个项目的 UniformGrid 会产生如下结果:

-------------------------------------
- +++++++++ - +++++++++ - +++++++++ -
-------------------------------------
- +++++++++ - +++++++++ - +++++++++ -
-------------------------------------
- +++++++++ - +++++++++ - ooooooooo -
-------------------------------------

(最后一个单元格为空)

我正在尝试产生这样的结果:

-------------------------------------
- +++++++++ - +++++++++ - +++++++++ -
-------------------------------------
- +++++++++ - +++++++++ - +++++++++ -
-------------------------------------
- +++++++++++++++ - +++++++++++++++ -
-------------------------------------

如果我以编程方式将其分解,我可以通过这样的嵌套轻松获得显示:

<StackPanel Orientation="Horizontal">
   <UniformGrid>
      item 1
      item 2
      item 3
   </UniformGrid>
   <UniformGrid>
      item 4
      item 5
      item 6
   </UniformGrid>
   <UniformGrid>
      item 7
      item 8
   </UniformGrid>
</StackPanel>

但我想通过 Xaml 获得我想要的结果。

【问题讨论】:

  • 这个问题之前有人问过,我认为你需要实现自己的面板...

标签: wpf itemscontrol itemspanel uniformgrid


【解决方案1】:

我找到了一种方法,方法是在绑定到集合的 DataTemplate 中嵌套一个新的 ItemsControl,并使用 ValueConverter 将集合转换为数组数组。

<ItemsControl ItemsSource="{Binding MyCollection, Converter={StaticResource ArraySplitConverter}, ConverterParameter=3}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <UniformGrid IsItemsHost="True" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Title} />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

还有 ValueConverter:

public class ArraySplitConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int param = System.Convert.ToInt16(parameter);
        object[] coll = (object[])value;
        ArrayList outer = new ArrayList();
        ArrayList inner = new ArrayList();

        for (int i = 0; i < coll.Length; i++)
        {
            inner.Add(coll[i]);
            if (((i + 1) % param == 0) || (i == coll.Length - 1)) { outer.Add(inner); inner = new ArrayList(); }
        }

        return outer;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    相关资源
    最近更新 更多