2012-01-25 2 views
0

Я пытаюсь определить, есть ли способ использовать элемент ItemsControl для группировки элементов в ItemsSource в отдельные ItemsPanels. В частности, я пытаюсь создать представление таким образом, что набор из примерно 8 элементов может быть указан в виде сетчатого типа, например UniformGrid, но с четными результатами, а не с пустыми ячейками.Может ли ItemsControl группировать связанную коллекцию?

Хотя UniformGrid с 8 элементов в источнике будет давать результаты, подобные следующим:

------------------------------------- 
- +++++++++ - +++++++++ - +++++++++ - 
------------------------------------- 
- +++++++++ - +++++++++ - +++++++++ - 
------------------------------------- 
- +++++++++ - +++++++++ - 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.

+0

Это было предложено ранее, я думаю, что вам нужно реализовать свою собственную панель ... –

ответ

0

Я нашел способ сделать это, вставив новый элемент ItemsControl в DataTemplate, привязанный к коллекции, и используя 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(); 
    } 
} 
Смежные вопросы