Question

J'essaie de déterminer s'il existe un moyen d'utiliser un itemsControl pour regrouper les éléments dans les éléments Source dans des éléments individuels. Plus précisément, j'essaie de créer une vue telle qu'une collection de disons, 8 éléments peuvent être répertoriés de manière de type grille, comme un germe uniforme, mais avec même des résultats et non des cellules vides.

Tandis qu'ungride uniforme avec 8 éléments dans la source produirait des résultats comme les suivants:

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

(La dernière cellule étant vide)

J'essaie de produire des résultats comme tel:

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

Si je le casse programmatique, je peux obtenir l'affichage facilement en nilitant comme ça:

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

Mais j'aimerais réaliser les résultats que je veux juste via XAML.

Était-ce utile?

La solution

J'ai trouvé le moyen de le faire en nilitant un nouveau itemsControl dans le datatemplate de celui lié à la collection, et en utilisant un ValueConverter pour convertir la collection en un tableau de tableaux.

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

Et le ValuConverter:

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();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top