Penyatuan Data WPF: Bagaimana cara saya mengakses konteks data "induk"?

216

Saya memiliki daftar (lihat di bawah) yang terkandung dalam jendela. Jendela DataContextmemiliki dua properti, Itemsdan AllowItemCommand.

Bagaimana cara mendapatkan mengikat untuk Hyperlink's Commandkebutuhan properti untuk tekad terhadap jendela ini 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>
Yordania
sumber
Bisakah Anda masuk ke debugger dan melangkah ke titik di mana UI sedang dibangun? Jika demikian Anda bisa mendapatkan ke dalam variabel dan mencoba untuk mengebor up
ist_lion
Solusi sederhana (yang juga berfungsi di aplikasi Windows 8 Store / Metro) ada di sini: http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382
LMK

Jawaban:

418

Anda dapat mencoba sesuatu seperti ini:

...Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}" ...
flq
sumber
2
Saya menggunakan ini untuk mengikat ICommand pada VM saya dari set ContextMenu pada ListBoxItem dari dalam Style. Bekerja dengan baik, terima kasih !!
Wil P
1
Bagaimana caranya melakukan ini di aplikasi Windows 8? Saya menggunakan "ElementName = ..." untuk membuatnya berfungsi, tetapi ia membocorkan DataContext
Joris Weimar
3
Apa yang Anda maksud dengan kebocoran?
flq
Sayangnya tidak berfungsi untuk saya karena orang tuanya ada di file yang berbeda.
Thomas
@ Thomas6767, Semoga Anda telah memecahkan masalah Anda, silakan kode Anda.
Mohammed Abrar Ahmed
38

Ini juga akan berfungsi:

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

ListViewakan mewarisi DataContextdari Window, jadi tersedia pada saat ini juga.
Dan karena ListView, seperti halnya kontrol yang serupa (misalnya Gridview,, ListBoxdll.), Adalah subkelas dari ItemsControl, Bindinguntuk kontrol semacam itu akan bekerja dengan sempurna.

Kylo Ren
sumber
15
(Melihat poster dan editor) Saya menemukan posting ini lucu ...: D
Jack Frost
@ JackFrost jika Yoda mengganggu kerja Kylo'l lagi. Kylo akan membunuh Yoda. : P
Kylo Ren
Tidak, dia tidak bisa. Yoda adalah satu dengan kekuatan sekarang. Hehehe
Jack Frost
10

Ini juga berfungsi di Silverlight 5 (mungkin sebelumnya juga tetapi saya belum mengujinya). Saya menggunakan sumber relatif seperti ini dan itu berfungsi dengan baik.

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

penyanyi
sumber