WPF Databinding: как получить доступ к «родительскому» контексту данных? - PullRequest
194 голосов
/ 15 июля 2009

У меня есть список (см. Ниже), содержащийся в окне. DataContext окна имеет два свойства, Items и AllowItemCommand.

Как получить привязку для свойства Hyperlink 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>

Ответы [ 3 ]

385 голосов
/ 15 июля 2009

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

...Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}" ...
21 голосов
/ 24 апреля 2016

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

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

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

6 голосов
/ 11 апреля 2012

Это также работает в Silverlight 5 (возможно, раньше, но я не проверял). Я использовал относительный источник, как это, и он работал нормально.

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

...