WPF Databinding: How do I access the "parent" data context?
Asked Answered
P

3

236

I have a list (see below) contained in a window. The window's DataContext has two properties, Items and AllowItemCommand.

How do I get the binding for the Hyperlink's Command property needs to resolve against the window's 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>
Pachisi answered 14/7, 2009 at 20:46 Comment(2)
Can you get into the debugger and step through to the point where the UI is being built? If so can you get into the variable and try to drill upBeata
Simple solution (which also works in Windows 8 Store/Metro app) is here: https://mcmap.net/q/119558/-how-to-access-parent-39-s-datacontext-in-windows-8-store-apps/15419382#15419382Appolonia
L
466

You could try something like this:

...Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}" ...
Lockage answered 14/7, 2009 at 20:51 Comment(6)
I used this to bind to a ICommand on my VM from a ContextMenu set on a ListBoxItem from within a Style. Worked great, thanks!!Bunn
How does one do this in a Windows 8 app? I used "ElementName=..." to get it to work, but it leaks the DataContextRedress
Sadly didn't work for me because the parent is in a different file.Albata
@Thomas6767 , Hope you have solved your issue can your please your code.Kickapoo
@MohdAbrarAhmed Could take a while, but I'll dig it up this weekend.Albata
Thanks! I was confusing myself with a relative binding because I was thinking it would give me the DataContext of the ancestor, not the ancestor itself. Adding the DataContext.<MyProperty> solved the problem :)Hyman
M
55

This will also work:

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

ListView will inherit its DataContext from Window, so it's available at this point, too.
And since ListView, just like similar controls (e. g. Gridview, ListBox, etc.), is a subclass of ItemsControl, the Binding for such controls will work perfectly.

Millburn answered 24/4, 2016 at 9:16 Comment(3)
(Looking at the poster and the editor) I find this post funny... :DOnceover
@JackFrost if Yoda interferes with Kylo'l work again. Kylo is going to kill Yoda. :PMillburn
Nope, he can't. Yoda is one with the force now. HeheheOnceover
K
10

This also works in Silverlight 5 (perhaps earlier as well but i haven't tested it). I used the relative source like this and it worked fine.

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

Kennithkennon answered 11/4, 2012 at 6:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.