est-il possible de faire quelque chose comme ceci: 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. P> Est-ce que cela est possible? Je veux vraiment que ma grille de données soit liée aux données. P> p>
6 Réponses :
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. P>
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. P>
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é: p> usage: p> 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! P> p>
Il reste toujours le problème qu'un grille code> nécessite défini l'ensemble des lignes et des colonnes à définir dans son
RowDefinitions code> et
colonnesDeFinitions code> 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.
La grille Si vous essayez de créer une zone de liste qui utilise à la fois un espace horizontal et vertical, un 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 code> 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. P>
Wrappanel Code> de la boîte à outils Silverlight serait une meilleure base. P>
datagramrid code> au lieu d'un
Listbox Code> P>
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 P>
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:
Il n'y a pas d'élémentContainestyle à Silverlight.
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 Le résultat ressemble à: p> et doit mettre en œuvre un itemscountrol code> - mais je suis sûr que cela fonctionne également avec une liste
code> p>
local: gridutils.itemSperRow code> propriété attachée. p> p>
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>
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?