11
votes

Comment accéder à DataContext de Parent dans les applications Windows 8 Store

Il s'agit d'une situation commune dans les applications XAML basées sur XAML (WPF / Silverlight / WinRT).

lien associé WPF -> WPF Databinding: Comment Est-ce que j'accède au contexte de données "parent"?

RelateSource avec ancestortype et mode = FINDANCESTOR vient généralement à secourir dans WPF.

Les deux sont manquants dans l'API WinRT. Comment accéder aux parents (peut ne pas être immédiat), DataContext ?

(Je suis conscient de templatedbinding et elementbinding mais les deux ne sont pas appropriés surtout dans DaTatemplate).


0 commentaires

3 Réponses :


1
votes

La liaison ElementName est toujours possible et pourrait fonctionner dans votre cas. Sinon, vous devez mettre en œuvre un comportement attaché.


0 commentaires

0
votes

Il y a plusieurs façons de faire face à ce problème:

La liaison ElementName est l'approche la plus courante, comme l'a souligné Filip.

Vous pouvez parcourir un arbre visuel jusqu'à ce que vous trouviez le parent. C'est ce que le trouvacestor fait en interne. Vous pourriez vous habiller dans un comportement pour une réutilisation facile.

Si vous utilisez Afficher les modèles, vous pouvez utiliser des messages au lieu de liaisons ou vous pouvez ajouter du contexte parent à chaque modèle de vue enfant.

Cueillir la meilleure solution dépendra de vos circonstances spécifiques.


0 commentaires

20
votes

Je viens d'avoir le même problème. Vraisemblablement, cela est courant ??

Voici une solution brute qui fonctionne:

  • lie la propriété Tag d'un élément de niveau supérieur au DataContext XXX

  • Liez la propriété que vous souhaitez via ElementName dans l'élément imbriqué, c'est-à-dire XXX


3 commentaires

Bonne suggestion, mais c'est Elémentbinding . Il ne fonctionne pas à l'intérieur DATATEMPLATE . Le comportement ci-joint semble être la voie à suivre.


Il fonctionne à l'intérieur de DataTemplate - vous liez la balise de l'élément (parent), qui a une référence au parent DataContext. J'utilise tout le temps de l'intérieur des éléments de DaTatemplate pour se lier au niveau DataContext de niveau supérieur.


Vous pouvez simplifier cela avec la suppression de la balise et utilisez simplement le DataContext directement {reliure DataContext.SomeProp, elenname = Gridtop}