Databinding WPF: come posso accedere al contesto di dati "parent"?


216

Ho un elenco (vedi sotto) contenuto in una finestra. La finestra DataContextha due proprietà Itemse AllowItemCommand.

Come ottengo che l'associazione per la proprietà Hyperlinkdella Commandproprietà debba risolversi con quella della finestra 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>

Puoi entrare nel debugger e passare al punto in cui viene costruita l'interfaccia utente? In tal caso, puoi accedere alla variabile e provare a eseguire il drill-up
ist_lion

La soluzione semplice (che funziona anche nell'app Store / Metro per Windows 8) è qui: http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382
LMK

Risposte:


418

Potresti provare qualcosa del genere:

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

2
Ho usato questo per associare un ICommand sulla mia VM da un ContextMenu impostato su un ListBoxItem all'interno di uno stile. Ha funzionato benissimo, grazie !!
Wil P

1
Come si fa in un'app di Windows 8? Ho usato "ElementName = ..." per farlo funzionare, ma perde il DataContext
Joris Weimar il

3
Cosa intendi per perdita?
flq,

Purtroppo non ha funzionato per me perché il genitore si trova in un file diverso.
Thomas,

@ Thomas6767, spero che tu abbia risolto il tuo problema, potresti soddisfare il tuo codice.
Mohammed Abrar Ahmed,

39

Questo funzionerà anche:

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

ListViewerediterà il suo DataContextda Window, quindi è disponibile anche a questo punto.
E poiché ListView, proprio come controlli simili (ad esempio Gridview, ListBoxecc.), È una sottoclasse di ItemsControl, Bindingtali controlli funzioneranno perfettamente.


16
(Guardando il poster e l'editore) Trovo questo post divertente ...: D
Jack Frost

@JackFrost se Yoda interferisce di nuovo con il lavoro di Kylo'l. Kylo ucciderà Yoda. : P
Kylo Ren,

No, non può. Yoda è tutt'uno con la forza ora. Hehehe
Jack Frost,

10

Questo funziona anche in Silverlight 5 (forse anche prima ma non l'ho provato). Ho usato la fonte relativa in questo modo e ha funzionato bene.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.