WPF-Datenbindung: Wie greife ich auf den übergeordneten Datenkontext zu?

215

Ich habe eine Liste (siehe unten) in einem Fenster. Das Fenster DataContexthat zwei Eigenschaften Itemsund AllowItemCommand.

Wie erhalte ich für die die Bindung Hyperlinkist CommandEigentum Bedürfnisse Entschlossenheit gegen das Fenster des 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>
Jordanien
quelle
Können Sie in den Debugger einsteigen und bis zu dem Punkt durchgehen, an dem die Benutzeroberfläche erstellt wird? Wenn ja, können Sie in die Variable gelangen und versuchen, einen
Drillup durchzuführen
Eine einfache Lösung (die auch in der Windows 8 Store / Metro-App funktioniert) finden Sie hier: http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382
LMK

Antworten:

417

Sie könnten so etwas versuchen:

...Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}" ...
flq
quelle
2
Ich habe dies verwendet, um aus einem ContextMenu, das auf einem ListBoxItem innerhalb eines Stils festgelegt ist, an einen ICommand auf meiner VM zu binden. Hat super funktioniert, danke !!
Wil P
1
Wie macht man das in einer Windows 8 App? Ich habe "ElementName = ..." verwendet, um es zum Laufen zu bringen, aber es leckt den DataContext
Joris Weimar
3
Was meinst du mit Leck?
flq
Hat bei mir leider nicht funktioniert, da sich der Elternteil in einer anderen Datei befindet.
Thomas
@ Thomas6767, Hoffe du hast dein Problem gelöst kannst du bitte deinen Code.
Mohammed Abrar Ahmed
37

Dies wird auch funktionieren:

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

ListViewerben seine DataContextvon Windowihm ist, damit an dieser Stelle ebenfalls verfügbar.
Und da ListView, genau wie ähnliche Kontrollen (zB Gridview, ListBoxusw.), ist eine Unterklasse von ItemsControldem Bindingfür diese Kontrollen perfekt funktionieren.

Kylo Ren
quelle
15
(Blick auf das Poster und den Herausgeber) Ich finde diesen Beitrag lustig ...: D
Jack Frost
@ JackFrost, wenn Yoda Kylo'l Arbeit wieder stört. Kylo wird Yoda töten. : P
Kylo Ren
Nein, er kann nicht. Yoda ist jetzt eins mit der Macht. Hehehe
Jack Frost
10

Dies funktioniert auch in Silverlight 5 (vielleicht auch früher, aber ich habe es nicht getestet). Ich habe die relative Quelle so verwendet und es hat gut funktioniert.

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

Sangers
quelle