2009-07-14 9 views
165

J'ai une liste (voir ci-dessous) contenue dans une fenêtre. La fenêtre DataContext a deux propriétés, Items et AllowItemCommand.WPF Databinding: Comment accéder au contexte de données "parent"?

Comment puis-je obtenir la liaison pour la propriété Command de Hyperlink à résoudre par rapport à la fenêtre DataContext?

<ListView ItemsSource="{Binding Items}"> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn Header="Action"> 
     <GridViewColumn.CellTemplate> 
      <DataTemplate> 
      <StackPanel> 
       <TextBlock> 

       <!-- this binding is not working --> 
       <Hyperlink Command="{Binding AllowItemCommand}" 
          CommandParameter="{Binding .}"> 
        <TextBlock Text="Allow" /> 
       </Hyperlink> 

       </TextBlock> 
      </StackPanel> 
      </DataTemplate> 
     </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
    </GridView> 
    </ListView.View> 
</ListView> 
+0

Pouvez-vous entrer dans le débogueur et passer au point où l'interface utilisateur est en cours de construction? Si oui pouvez-vous entrer dans la variable et essayer de forer –

+0

Une solution simple (qui fonctionne également dans Windows 8 Store/Metro app) est ici: [http://stackoverflow.com/questions/15366609/how-to-access- parents-datacontext-dans-fenêtre-8-store-apps/15419382 # 15419382] (http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382) – LMK

Répondre

331

Vous pouvez essayer quelque chose comme ceci:

...Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}" ... 
+2

Je l'ai utilisé pour lier une ICommand sur ma VM à partir d'un ContextMenu défini sur un ListBoxItem à partir d'un Style. A travaillé super, merci !! –

+1

Comment fait-on cela dans une application Windows 8? J'ai utilisé "ElementName = ..." pour le faire fonctionner, mais il fuit le DataContext –

+3

Que voulez-vous dire par fuite? – flq

6

Cela fonctionne aussi dans Silverlight 5 (peut-être plus tôt, ainsi, mais je ne l'ai pas testé). J'ai utilisé la source relative comme ça et ça a bien fonctionné.

RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=telerik:RadGridView}"

+0

Pourquoi n'est-ce pas une bonne idée? – rolls

17

Cela fonctionne également:

<Hyperlink Command="{Binding RelativeSource={RelativeSource AncestorType=ItemsControl}, 
          Path=DataContext.AllowItemCommand}" /> 

ListView héritera ses DataContext de Window, il est donc disponible à ce moment-là, aussi.
Et comme ListView, tout comme les contrôles similaires (par exemple Gridview, ListBox, etc.), est une sous-classe de ItemsControl, le Binding pour de tels contrôles fonctionnera parfaitement.

Questions connexes