Liaison de données WPF: comment accéder au contexte de données «parent»?

216

J'ai une liste (voir ci-dessous) contenue dans une fenêtre. La fenêtre DataContexta deux propriétés, Itemset AllowItemCommand.

Comment puis-je obtenir la liaison pour les Hyperlinks » Commandbesoins de propriété à résoudre contre la fenêtre de 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>
Jordan
la source
Pouvez-vous entrer dans le débogueur et passer au point où l'interface utilisateur est en cours de construction? Si c'est le cas, pouvez-vous entrer dans la variable et essayer d'explorer
ist_lion
Une solution simple (qui fonctionne également dans Windows 8 Store / Metro app) est ici: http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382
LMK

Réponses:

418

Vous pouvez essayer quelque chose comme ceci:

...Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}" ...
flq
la source
2
Je l'ai utilisé pour me lier à une ICommand sur ma machine virtuelle à partir d'un ContextMenu défini sur un ListBoxItem à partir d'un style. Très bien travaillé, merci !!
Wil P
1
Comment faire cela dans une application Windows 8? J'ai utilisé "ElementName = ..." pour le faire fonctionner, mais il fuit le DataContext
Joris Weimar
3
Qu'entendez-vous par fuite?
flq
Malheureusement, cela n'a pas fonctionné pour moi car le parent est dans un fichier différent.
Thomas
@ Thomas6767, j'espère que vous avez résolu votre problème.
Mohammed Abrar Ahmed
39

Cela fonctionnera également:

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

ListViewhéritera ses DataContextde Window, il est donc disponible à ce moment - là, aussi.
Et comme ListView, tout comme les contrôles similaires (par exemple Gridview, ListBoxetc.), est une sous-classe de ItemsControl, Bindingpour de tels contrôles fonctionneront parfaitement.

Kylo Ren
la source
16
(En regardant l'affiche et l'éditeur) Je trouve ce post drôle ...: D
Jack Frost
@JackFrost si Yoda interfère avec le travail de Kylo'l à nouveau. Kylo va tuer Yoda. : P
Kylo Ren
Non, il ne peut pas. Yoda fait désormais partie de la force. Hehehe
Jack Frost
10

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

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

chanteurs
la source