9
votes

Comment faire référence à une définition de ligne / colonne dans la grille.row / grid.column?

Ceci peut être évident ... Comment faire référence aux éléments xaml plus tard dans le même fichier xaml?

Exemple: xxx

puis je définis divers contrôles à l'intérieur du grille et je voudrais faire référence à ces lignes par nom, pas par numéro: xxx

parce que si j'utilise grid.row = "0" Sur de nombreux contrôles, alors lorsque j'ajoute une ligne avant la première rangée, je dois modifier toutes les références à grid.row = "1" à la main.

Edit :

Grâce aux réponses que j'ai lisées un peu sur xaml.

Après tout, il est possible de faire référence à un élément précédent par nom apparemment: xxx

ou xxx

mais cela ne résout pas le problème tout à fait parce que la grille.row nécessite une intensive, alors que quelqueilrowow n'est pas un int, c'est un système.windows.controls.rowedéfinition.

donc ce qu'il faut donc est l'équivalent xaml de xxx

qui dans le code derrière serait écrit xxx

ou faire une liaison de grid.row à la propriété, sur le Objet grille , qui a le chemin "rowdefinition.indexof" avec le paramètre souffert de gridrow : xxx

(Cela ne fonctionne pas en C #, je dois donc faire quelque chose de mal, bien que grid.setrow ci-dessus fonctionne)

xaml 2009 définit < x: arguments> pour invoquer des constructeurs qui ont des paramètres. Si cela a fonctionné dans WPF XAML, alors quelque chose comme ça fonctionnerait, je suppose que je suppose? xxx

peut aussi être remplacé par dans xaml 2009.


1 commentaires

Je pense que tout ce qui ne fonctionnerait jamais comme le chemin de la propriété ne permettrait pas à l'invocation des méthodes telles que indexof .


3 Réponses :


2
votes

Ceci, malheureusement, ne fonctionne pas.

Les propriétés ci-jointes en question (c'est-à-dire: grid.row) sont utilisées par la grille pour gérer leur propre mise en page, et la manière dont elle est conçue, vous devez mettre le numéro.

Malheureusement, la modification des chiffres lorsque l'insertion d'une ligne est assez courante dans le développement XAML. Une option - vous pouvez mettre en des lignes de "hauteur zéro" supplémentaires non utilisées et les utilisez plus tard, si vous savez que vous allez ajouter des lignes.


5 commentaires

Merci. Pourquoi une chose si simple n'est-elle pas possible? Quelque chose comme grid.row = "{x: nom quelquegramrow}" doit être implémenté ...


@Semmike: Je soupçonne que c'est à cause de la façon dont cela fonctionne. La grille enquête sur ses enfants pour la grille.row et il n'y a pas de véritable contraignante impliquée ... Toute nommée devrait être réalisée sur des identifiants sans sécurité sans type et pourrait conduire à des problèmes étranges.


Eh bien, avec nom = "Somename" Vous pouvez déjà référencer l'élément dans le code-derrière-derrière, alors pourquoi pas dans la XAML elle-même? Ce n'est pas moins "de type sécurisé" dans XAML que dans C # ... Quoi qu'il en soit, ce n'est pas possible, donc le point est discutable, merci de me mettre rapidement de ma misère!


Désolé, je devais faire la réponse de l'autre gars à l'accepter! Pourtant, ce n'est pas possible à Vanilla Xaml (surprenant), alors vous avez raison.


@Semmike: Ouais, pas de problème. Son extension de balisage est un excellent moyen de contourner.



15
votes

pour le LULZ:

<Grid Width="200" Height="200"
      xmlns:me="clr-namespace:Test.MarkupExtensions">
    <Grid.RowDefinitions>
        <RowDefinition Name="row1" />
        <RowDefinition Name="row2" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Name="col1" />
        <ColumnDefinition Name="col2" />
    </Grid.ColumnDefinitions>
    <Border Background="Lime" Grid.Row="{me:GridDefinition row1}" Grid.Column="{me:GridDefinition col1}" />
    <Border Background="Red" Grid.Row="{me:GridDefinition row2}" Grid.Column="{me:GridDefinition col1}" />
    <Border Background="Yellow" Grid.Row="{me:GridDefinition row1}" Grid.Column="{me:GridDefinition col2}" />
    <Border Background="Blue" Grid.Row="{me:GridDefinition row2}" Grid.Column="{me:GridDefinition col2}" />
</Grid>


7 commentaires

Belle façon de contourner cette limitation via MarkupExtensions.


Merci beaucoup! Je ne savais pas du tout sur les extensions de balisage ou les convertisseurs de type, je leur lise maintenant sur MSDN. Je pense que je vais utiliser ce genre de chose (pas seulement "pour le Lulz"), ça me fait comme xaml mieux ...


@Semmike: Je pense que je devrais mentionner que cela pourrait avoir un impact sur la performance sur les grandes grilles que le comportement référence est plutôt complexe et le nombre des lignes est récupéré via index de qui en fonction de la mise en œuvre peut également être lent. C'est pourquoi ma réponse est préfixée avec cette ligne.


@SemMike: Il suffit de regarder, selon un décompiler index de devrait avoir O (1), il ne faut probablement pas penser prématurément d'optimisation ici, je suppose.


Merci, je vais probablement utiliser votre méthode à la fin mais je suis curieux de XAML maintenant, j'ai fait de la lecture et édité la question originale ...


Bonne solution. Existe-t-il un moyen de faire de cette œuvre dans la vue XAML Design? En mode de conception, la méthode ou l'opération d'avertissement n'est pas implémentée », mais elle ne spécifie pas quelle méthode doit être mise en œuvre.


@JIM: Aucune idée, je n'utilise jamais la vue de conception, xaml seulement.



0
votes

Une autre façon d'obtenir la grille.Column serait contraignant à la viewModel comme ceci: xxx

dans la vue Model: xxx

Et enfin la définition de vos valeurs de colonne: xxx

sais, si vous devez insérer des colonnes (fonctionne également avec des lignes également), vous devez simplement modifier les valeurs d'index dans votre viewModel . Cette approche devrait être moins exhaustive que la modification de chaque attribut de grille.column dans votre XAML.


0 commentaires