Liaison XAML pour le parent de l'objet de données
J'ai une colonne de grille défini. Le parent grille reçoit ses éléments à partir d'une ObservableCollection de type ItemClass. ItemClass a deux propriétés: Chaîne Foo, et bool IsEditAllowed.
Cette colonne est liée à la propriété Foo. Il y a un modèle de contrôle pour l'édition de la cellule. J'aimerais lier la ItemClass.IsEditAllowed de la propriété à la propriété IsEnabled de la zone de texte dans le modèle.
La question est de savoir comment lier. Cela peut-il être fait? Le code XAML ci-dessous me met "Impossible de trouver la source de la liaison avec la référence" dans la trace de débogage.
La grille me permettra de lier le ItemClass lui-même pour le champ par le biais de certains "personnalisée" de l'événement truc, et j'ai peut alors se lier à l'une de ses propriétés. C'est très bien, mais il semble encombrants. Mais si c'est le seul moyen, c'est le seul moyen.
<dxg:GridColumn
Header="Foo Column"
FieldName="Foo">
<dxg:GridColumn.EditTemplate>
<ControlTemplate>
<TextBox Text="{Binding Value, Mode=TwoWay}"
IsEnabled="{Binding Path=IsEditAllowed, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ItemClass}, AncestorLevel=1}}" />
</ControlTemplate>
</dxg:GridColumn.EditTemplate>
</dxg:GridColumn>
OriginalL'auteur Ed Plunkett | 2013-05-08
Vous devez vous connecter pour publier un commentaire.
Il y a deux potentiellement plus facile des façons d'établir cette liaison.
1) le nom de la grille. Ensuite, votre liaison pourrait ressembler à quelque chose comme ceci (en supposant dxg:GridControl possède une propriété nommée "Éléments" et que vous avez attribué une instance de votre ItemClass à la propriété):
2) l'utilisation de liaison relative, mais regardez pour les GridControl plutôt que quelque chose que nominalement interne à la façon GridControl fonctionne (c'est, GridControlContentPresenter). Cela vous permet de vous éloigner de l'détails de mise en œuvre de GridControl, qui sont peut-être plus susceptibles de modifier de façon à briser votre demande que des propriétés sur GridControl lui-même.
Vous pouvez également lire les l'Arborescence Visuelle et la Logique de l'Arbre dans WPF/xaml. Le "Ancêtre" relative des liaisons se réfère à des ancêtres dans l'arbre visuel, c'est des choses comme des conteneurs parent, et pas de super - ou les classes de base (comme vous l'avez découvert, je pense).
Désolé, au premier abord, j'ai mal compris que ItemsClass contenait une ObservableCollection. Les autres, vous avez est DataContext. La plupart/tous ItemControls définir le DataContext sur la question des conteneurs à être ce que l'élément est lié à partir de la source de la collection. Liaisons, en l'absence d'une spécification de source, utilisez le DataContext comme de leur source. Vous pouvez utiliser quelque chose comme Snoop pour voir ce que le DataContext est sur vos cellules et/ou les lignes?
Ouais, j'ai obtenu que tout est réglé. Une option est de suivre l'arborescence visuelle. L'option la plus facile, il s'est avéré que la cellule du DataContext objet est une classe qui a la valeur de la cellule dans une propriété de Valeur, et qui avait aussi la ligne objet, l'ItemClass exemple, dans une Ligne de propriété. C'était donc une question très simple d'utilisation.
OriginalL'auteur dtm
Voici la réponse[1]. FindAncestor trouve ancêtres dans l'exécution de code XAML arbre, pas à des objets C#. Il ne peut pas marcher jusqu'à la ItemClass instance de la députée, nous sommes obligés de. Mais nous savons que quelqu'un au-dessus de nous dans le code XAML de l'arbre nous liait à ce membre, et il était lié à l'ItemClass instance elle-même. Donc, celui qui est, nous le trouvons, et nous avons ensuite le ItemClass.
Donc, nous allons ajouter de traçage de débogage de la reliure, et nous allons voir ce que le XAML situation ressemble à l'exécution. Sans doute, il existe d'autres et sans doute des moyens plus intelligents pour le faire, mais je sais que celui-ci sans aucune recherche.
D'abord ajouter ce pour les espaces de noms en haut du fichier XAML:
...et puis pour la liaison elle-même, d'ajouter ceci:
Comme suit:
Au moment de l'exécution, lorsque le TextEdit la propriété IsEnabled essaie d'avoir une valeur à partir de la liaison, la liaison de promenades à travers le code XAML de l'arbre à la recherche d'un ancêtre du type spécifié. Il ne cesse de regarder jusqu'à ce qu'il trouve un ou à court d'arbre, et si nous avons mis du calque sur elle, elle trace le type de tout ce qu'il trouve tout le chemin jusqu'à. Nous en avons parlé à la recherche de déchets qu'elle ne trouverez jamais, donc il va nous donner une trace du type de chaque ancêtre jusqu'à la racine de l'arbre, les feuilles de la première et de la racine dernier. Je reçois 75 lignes des ancêtres dans ce cas.
Je l'ai fait, et a trouvé un peu de candidats probables. J'ai vérifié chacun, et le gagnant s'est avéré être dgx:GridCellContentPresenter, qui a un RowData de la propriété. RowData a beaucoup de propriétés, et RowData.Ligne est la ligne de l'instance de ItemClass. dxg:GridCellContentPresenter appartient à la DevExpress de la grille de la bibliothèque, nous sommes de l'aide; d'un autre fournisseur de classe de la grille, il y aurait vraisemblablement un équivalent.
Voici le travail de liaison:
Si DevExpress, le vendeur, réécrit leur GridControl classe, nous allons être en difficulté. Mais cela est vrai de toute façon.
...
[1] Meilleure réponse, si c'est trop DevExpress spécifiques pour être d'un réel intérêt: Le DataContext de la zone de texte lui-même s'avère être dxg:EditGridCellData, qui a un RowData propriété comme GridCellContentPresenter. Je peux utiliser IsEnabled="{Binding Path=RowData.Ligne.IsEditAllowed}".
Cependant, ce que je voulais vraiment faire tout au long de était de ne pas présenter une grille complètement stupide désactivé zones de texte, mais plutôt à en permettre l'édition sur certaines lignes de la grille. Et DevExpress grille vous permet de le faire par le biais de la ShowingEditor événement.
XAML:
.cs:
OriginalL'auteur Ed Plunkett