WPF Liaison de parent DataContext

Nous avons une application WPF avec un standard en utilisant le pattern MVVM, en misant sur Cinch (et donc MefedMVVM) pour Affichage -> ViewModel de la résolution. Cela fonctionne bien, et je peux lier les contrôles pertinents pour les propriétés dans le ViewModel.

À l'intérieur d'un point de Vue particulier, nous avons une Infragistics XamGrid. Cette grille est liée à une ObservableCollection sur le ViewModel, et affiche les lignes appropriées. Cependant, je puis avoir une colonne spécifique sur cette grille que j'essaie de lier une zone de texte texte de la valeur à une propriété sur le parent DataContext, plutôt que de l'ObservableCollection. Cette liaison est un échec.

Nous avons traversé plusieurs options ici, y compris:

  1. À l'aide de AncestorType de la piste vers le haut de l'arbre et de se lier à la DataContext de la mère UserControl comme (à partir de la grande réponse à cette question, ainsi que cette une)...

    {Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
  2. Spécifiant le ElementName et d'essayer de cibler le haut niveau de contrôle directement. Avoir un regardez ici si vous souhaitez lire à propos de l'utilisation ElementName.

  3. À l'aide d'un 'proxy' FrameorkElement définis dans les ressources pour le contrôle UserControl à essayer "passer" le contexte nécessaire. Nous définissons l'élément ci-dessous, puis de référence comme une ressource statique...

    <FrameworkElement x:Key="ProxyContext" DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource Self}}"></FrameworkElement>

Dans ce cas, la liaison trouve le FrameworkElement, mais ne peut pas accéder à quelque chose au-delà (lors de la spécification d'un Chemin d'accès).

Avoir lu, il semble assez probable que cela est causé par la Infragistics XamGrid les colonnes à l'extérieur de l'arbre. Cependant, même si c'est le cas, au moins 2 ou 3 options devrait fonctionner.

Nos dernières pensées sont que c'est lié à la V - VM contraignant, mais même à l'aide de Snoop nous avons encore trouver ce que la cause exacte est. Je ne suis pas un expert avec WPF liaison pour tous les pointeurs serait appréciée.

EDIT: j'ai trouvé quelques exemples de templates à partir de Infragistics ici que je vais essayer.

EDIT 2: Comme l'a souligné @Dtex, les modèles sont le chemin à parcourir. Voici les extrait pour une utilisation avec un XamGrid:

<ig:GroupColumn Key="CurrentDate">
                <ig:GroupColumn.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=DataContext.CurrentDateTest, RelativeSource={RelativeSource AncestorType=UserControl}}" />
                    </DataTemplate>
                </ig:GroupColumn.HeaderTemplate>
                <ig:GroupColumn.Columns>

J'ai quitté le XML ouvert... il vous suffit d'ajouter les colonnes que vous voulez, puis de fermer le les balises pertinentes.

  • "Après avoir lu, il semble assez probable que cela est causé par la Infragistics XamGrid les colonnes à l'extérieur de l'arbre. Cependant, même si c'est le cas, au moins 2 ou 3 options doit travailler". En fait, je pense que c'est incorrect, ils ne sont pas dans l'arborescence visuelle, vous ne pouvez pas faire référence à rien, pas même à l'aide de ElementName comme vous pouvez le voir. Vous pouvez contourner le problème de la définition d'un DataGridTemplateColumn et spécifier la liaison dans la cellule modèle
  • Bien sûr, et c'est là ma limite de liaison / de l'arbre de la connaissance est le ralentissement de moi vers le bas. Je vais essayer un modèle de la colonne, mais il apprécierait un exemple si vous en avez un.
  • Juste de l'OMI, mais c'est pourquoi je ne pense pas que les contrôles de l'utilisateur/contrôles personnalisés doivent définir leurs DataContext. Il casse des choses pour le consommateur!
  • Merci de ne pas mettre des réponses à des questions. Vous pouvez poster une réponse distincte post pour partager votre solution.
InformationsquelleAutor Nick | 2012-11-16