2012-01-25 11 views
0

ItemsSourceのアイテムを個々のItemsPanelsにグループ化するためにItemsControlを使用する方法があるかどうかを判断しようとしています。具体的には、8つのアイテムのコレクションをUniformGridのようにグリッドタイプの方法でリストすることができるようにビューを作成しようとしていますが、空のセルではなく均等な結果が得られます。Items ItemsControlはバインドされたコレクションをグループ化できますか?

ソース内の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を介してほしい結果を達成したいと思います。

+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(); 
    } 
} 
関連する問題