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}" ...
FLQ
источник
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}"

Санджерс
источник