2012-01-25 50 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

我找到了通過在綁定到集合的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(); 
    } 
} 
相關問題