WPF Databinding: как получить доступ к «родительскому» контексту данных?


216

У меня есть список (см. Ниже), содержащийся в окне. Окно 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>

Можете ли вы войти в отладчик и перейти к точке, где строится пользовательский интерфейс? Если да, можете ли вы войти в переменную и попытаться
углубиться

Простое решение (которое также работает в Windows 8 Store / Metro app) находится здесь: http://stackoverflow.com/questions/15366609/how-to-access-parents-datacontext-in-window-8-store-apps/15419382 # 15419382
ЛМК

Ответы:


418

Вы можете попробовать что-то вроде этого:

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

2
Я использовал это для привязки к ICommand на моей виртуальной машине из ContextMenu, установленного в ListBoxItem из стиля. Работал отлично, спасибо !!
Wil P

1
Как это сделать в приложении для Windows 8? Я использовал «ElementName = ...», чтобы заставить его работать, но он пропускает DataContext
Joris Weimar

3
Что вы имеете в виду под утечкой?
FLQ

К сожалению, не работает для меня, потому что родитель находится в другом файле.
Томас

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

39

Это также будет работать:

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

ListViewбудет наследовать его DataContextот Window, так что он также доступен на этом этапе.
И поскольку ListView, как и аналогичные элементы управления (например Gridview, ListBoxи т. Д.), Является подклассом ItemsControl, Bindingтакие элементы управления будут работать идеально.


16
(Глядя на постер и редактора) Я нахожу этот пост смешным ...: 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.