WPF Databinding: Jak uzyskać dostęp do kontekstu danych „nadrzędnych”?

215

Mam listę (patrz poniżej) zawartą w oknie. Okno DataContextma dwie właściwości Itemsi AllowItemCommand.

Jak mogę uzyskać wiążące dla Hyperlink„s Commandpotrzeb własności Aby rozwiązać przed okno na 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>
Jordania
źródło
Czy możesz wejść do debugera i przejść do punktu, w którym budowany jest interfejs użytkownika? Jeśli tak, możesz wejść do zmiennej i spróbować
wykończyć
Proste rozwiązanie (które działa również w aplikacji Windows 8 Store / Metro) znajduje się tutaj: http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382
LMK

Odpowiedzi:

417

Możesz spróbować czegoś takiego:

...Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}" ...
flq
źródło
2
Użyłem tego do powiązania z ICommand na mojej maszynie wirtualnej z ContextMenu ustawionego na ListBoxItem z poziomu stylu. Działa świetnie, dzięki !!
Wil P
1
Jak to zrobić w aplikacji Windows 8? Użyłem „ElementName = ...”, aby go uruchomić, ale przecieka on DataContext
Joris Weimar
3
Co rozumiesz przez wyciek?
flq
Niestety nie działało to dla mnie, ponieważ rodzic jest w innym pliku.
Thomas,
@ Thomas6767, Mam nadzieję, że rozwiązałeś problem, czy możesz zadowolić swój kod.
Mohammed Abrar Ahmed
37

Będzie to również działać:

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

ListView odziedziczy to DataContext po nim Window, więc jest dostępny również w tym momencie.
A ponieważ ListView, podobnie jak w podobnych kontroli (np Gridview, ListBoxitd), jest podklasą ItemsControlThe Bindingtakich kontroli będzie działać doskonale.

Kylo Ren
źródło
15
(Patrząc na plakat i redaktora) Uważam ten post za zabawny ...: D
Jack Frost
@JackFrost, jeśli Yoda ponownie zakłóci pracę Kylo'la. Kylo zamierza zabić Yodę. : P
Kylo Ren
Nie, nie może. Yoda jest teraz jednym z siłą. Hehehe
Jack Frost
10

Działa to również w Silverlight 5 (być może również wcześniej, ale go nie testowałem). Użyłem takiego źródła względnego i działało dobrze.

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

sangers
źródło