Прив'язка даних WPF: Як я можу отримати доступ до контексту даних "батьків"?


215

У мене є список (див. Нижче), що міститься у вікні. Вікно DataContextмає два властивості Itemsта AllowItemCommand.

Як отримати прив'язку для властивостей Hyperlink's Commandдля вирішення проти вікна 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>

Чи можете ви потрапити в налагоджувач і перейти до місця побудови інтерфейсу? Якщо так, ви можете потрапити в змінну і спробувати розгорнути
ist_lion

Просте рішення (яке також працює в додатку Windows 8 Store / Metro) знаходиться тут: http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382
LMK

Відповіді:


417

Ви можете спробувати щось подібне:

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

2
Я використовував це для прив'язки до ICommand на моєму VM з набору ContextMenu на ListBoxItem у стилі. Працювали чудово, дякую !!
Wil P

1
Як це зробити в додатку для Windows 8? Я використовував "ElementName = ...", щоб змусити його працювати, але він витікає DataContext
Joris Weimar

3
Що ви маєте на увазі під протіканням?
flq

На жаль, не працювало для мене, оскільки батьків є в іншому файлі.
Томас

@ Thomas6767, Сподіваюся, що ви вирішили свою проблему, можете задовольнити свій код.
Мухаммед Абрар Ахмед

37

Це також буде працювати:

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

ListViewбуде успадковано його DataContextвід Window, тому він доступний і в цей момент.
А оскільки ListView, як і подібні елементи управління (наприклад Gridview, ListBoxтощо), є підкласом ItemsControl, Bindingдля таких елементів керування буде працювати чудово.


15
(Дивлячись на плакат та редактора) Я вважаю цей пост смішним ...: D
Джек Фрост

@JackFrost, якщо Йода перешкоджає роботі Kylo'l знову. Кайло збирається вбити Йоду. : P
Kylo Ren

Ні, він не може. Йода зараз є силою. Хехехе
Джек Мороз

10

Це також працює в Silverlight 5 (можливо, і раніше, але я не перевіряв його). Я використовував таке джерело, як це, і воно спрацювало чудово.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.