11
votes

Utilisation d'une grille comme objetPanneau pour un articleControl à Silverlight 3

est-il possible de faire quelque chose comme ceci: xxx

La source d'éléments serait une liste d'objets qui possédaient les propriétés du texte, de la colonne et de la ligne.

Est-ce que cela est possible? Je veux vraiment que ma grille de données soit liée aux données.


1 commentaires

Ce n'est pas clair ce que vous avez des intentions complètes. Êtes-vous vraiment après la sémantique de la liste qui est une liste (éventuellement de défilement) d'éléments N où un ou plusieurs peuvent être sélectionnés?


6 Réponses :


3
votes

Ce que vous avez ne fonctionnerez pas car Silverlight enveloppe chaque élément - chaque instance du DataTemplate - dans une liste ListboxItem, et les propriétés attachées de la grille.column et de la grille.row. doivent être appliquées sur cette listeBoxItem, non à la Textbox qui devient le contenu de cette listeBoxItem.

La bonne nouvelle est que vous pouvez définir des attributs sur la liste impliciteboxItem à l'aide de ListBox.ItemcontainerStyle.

La mauvaise nouvelle est que l'élémentContainerStyle ne supporte pas facilement la liaison. Donc, vous ne pouvez pas l'utiliser pour régler la grille.column et la grille.row Propriétés connectées aux attributs de l'élément de données à portée de main.

Une solution que j'ai utilisée est dans la liste de sous-classes et configurer le Reliaison dans la préparationErecontainerForItemoverride. Voici un exemple très brut et câblé: xxx

usage: xxx

Il y a (au moins) deux la plus grande laturalité avec Ce code: Tout d'abord, vous devez toujours spécifier Explicitement les élémentsPanel dans XAML, même si le contrôle fonctionne uniquement avec des panneaux de grille; et deuxièmement, les chemins de liaison sont câblés dans le code. Le premier peut être adressé à l'aide du mécanisme de style de contrôle normal de la commande et la seconde en définissant des propriétés telles que RowBindingPath et ColumnBindingPath, qui PRÉPARYEMPORCONTAINERRIDE peut consulter au lieu d'utiliser des chemins câblés. Espérons que suffisamment pour vous faire aller quand même!


4 commentaires

Il reste toujours le problème qu'un grille nécessite défini l'ensemble des lignes et des colonnes à définir dans son RowDefinitions et colonnesDeFinitions collection.


Je ne sais pas si cela fonctionne. Une partie du problème est qu'il n'ya pas de reliage (au moins que je puisse trouver) dans SL3. J'ai essayé de simplement faire un retrait sur l'objet Element, mais cela n'a pas fonctionné non plus. Itowlson: Avez-vous eu ceci pour travailler avec SL3?


Bindingoperations est une classe statique dans l'espace de noms System.Windows.Data. Oui, j'ai eu ce fonctionnement avec SL3 (bien qu'à l'aide d'une toile plutôt qu'à une grille, mais le concept est identique, avec une reconnaissance due à la question soulevée par Anthonywjones).


Désolé pour la nécromancie du fil, mais j'ai trouvé cela très utile et j'ai recommandé de le faire au moins un peu plus flexible. J'ai utilisé votre méthode, mais j'ai ajouté des propriétés de dépendance supplémentaires à mes articles personnalisésControl pour chacun des "chemins" en question, par exemple. Rampath. De cette façon, il n'y a pas de chaînes de codage dur dans la préparation de la préparation, je viens de définir une valeur par défaut pour le DP et laissez la consommation XAML définir une nouvelle valeur si nécessaire.



2
votes

La grille ne convient pas à l'utilisation que vous essayez de le mettre ici. Ses attentes à l'ensemble des lignes et des colonnes disponibles doivent être définies avant de commencer à attribuer des éléments aux cellules.

Si vous essayez de créer une zone de liste qui utilise à la fois un espace horizontal et vertical, un Wrappanel de la boîte à outils Silverlight serait une meilleure base.

D'autre part Si vous essayez de créer une "grille de données", envisagez de transposer ou de regrouper les colonnes de chaque ligne du modèle, vous pouvez utiliser le fichier datagramrid au lieu d'un Listbox


0 commentaires

0
votes

Si vous êtes intéressé par un tel scénario dans la version future de Silverlight, veuillez voter pour portage de la disposition de la grille Adobe Flex , qui fonctionnera parfaitement dans ce scénario


0 commentaires

-1
votes

Vous devez juste avoir besoin de créer deux propriétés ci-jointes pour la grille (quelque chose comme les colonnesNumber et le n ° de rowNumber, qui seraient remplis de collections de colonnes et de rowdefenitions). Puis remplacez l'élément par défautContainerStyle dans les itemsControl (car tous les éléments de l'itemStrol enveloppés par ContentPresenters). Exemple de code: xxx


1 commentaires

Il n'y a pas d'élémentContainestyle à Silverlight.



2
votes

J'ai trouvé une autre solution intéressante pour ce problème: http://www.scottlogic.co.uk/blog/colin/2010/11/USTION-A-Grid-as-the-panel-for-an-itemControl/

L'exemple est fait avec Un itemscountrol - mais je suis sûr que cela fonctionne également avec une liste

Le résultat ressemble à: xxx < / Pré>

et doit mettre en œuvre un local: gridutils.itemSperRow propriété attachée.


0 commentaires

2
votes

Cela ne fonctionnera que si vous savez combien de lignes et de colonnes dont vous avez besoin et uniquement dans Silverlight 5. (Vous ne pouvez pas lier la valeur de la propriété de Setter dans Silverlight 4.)

<Grid x:Name="LayoutRoot" Background="White">
        <ItemsControl x:Name="ic" Background="#FFE25454">
            <ItemsControl.Resources>
                <Style TargetType="ContentPresenter">
                    <Setter Property="Grid.Row" Value="{Binding X}"/>
                    <Setter Property="Grid.Column" Value="{Binding Y}"/>
                </Style>
            </ItemsControl.Resources>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid ShowGridLines="True">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions></Grid>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>

                    <TextBlock Text="{Binding text}"/>

                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>


0 commentaires