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>

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}" ...

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.


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}"

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.