Ligação de dados do WPF: Como acesso o contexto de dados "pai"?

215

Eu tenho uma lista (veja abaixo) contida em uma janela. A janela DataContexttem duas propriedades Itemse AllowItemCommand.

Como faço para obter a ligação para os Hyperlink's Commandnecessidades de propriedade para resolver contra a janela 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>
Jordânia
fonte
Você pode entrar no depurador e avançar até o ponto em que a interface do usuário está sendo criada? Em caso afirmativo, você pode entrar na variável e tentar detalhar
ist_lion 14/07/2009
A solução simples (que também funciona no aplicativo Windows 8 Store / Metro) está aqui: http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382
LMK

Respostas:

417

Você pode tentar algo como isto:

...Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}" ...
flq
fonte
2
Eu usei isso para ligar a um ICommand na minha VM de um ContextMenu definido em um ListBoxItem de dentro de um Style. Trabalhou muito bem, obrigado !!
Wil Wil
1
Como alguém faz isso em um aplicativo do Windows 8? Eu usei "ElementName = ..." para fazê-lo funcionar, mas vaza o DataContext
Joris Weimar
3
O que você quer dizer com vazamento?
FLQ
Infelizmente, não funcionou para mim porque o pai está em um arquivo diferente.
Thomas
@ Thomas6767, espero que você tenha resolvido seu problema, por favor, seu código.
Mohammed Abrar Ahmed
37

Isso também funcionará:

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

ListViewherdará seu DataContextde Window, então também está disponível neste momento.
E já que ListView, assim como controles semelhantes (por exemplo Gridview, ListBoxetc.), é uma subclasse de ItemsControl, o Bindingcontrole para tais controles funcionará perfeitamente.

Kylo Ren
fonte
15
(Olhando para o pôster e o editor) Acho este post engraçado ...: D
Jack Frost
@JackFrost se Yoda interferir no trabalho de Kylo'l novamente. Kylo vai matar Yoda. : P
Kylo Ren
Não, ele não pode. Yoda é um com a força agora. Hehehe
Jack Frost
10

Isso também funciona no Silverlight 5 (talvez mais cedo também, mas ainda não o testei). Eu usei a fonte relativa assim e funcionou bem.

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

sangers
fonte