views:

29346

answers:

6

How do I use RelativeSource with WPF bindings and what are the different use-cases?

+3  A: 

Don't forget TemplatedParent:

<Binding RelativeSource="{RelativeSource TemplatedParent}"/>

or

{Binding RelativeSource={RelativeSource TemplatedParent}}
Bob King
+50  A: 

If you want to bind to another property on the object:

{Binding Path=PathToProperty, RelativeSource={RelativeSource Self}}

If you want to get a property on an ancestor:

{Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}

If you want to get a property on the templated parent (so you can do 2 way bindings in a ControlTemplate)

{Binding Path=PathToProperty, RelativeSource={RelativeSource TemplatedParent}}

or, shorter (this only works for OneWay bindings):

{TemplateBinding Path=PathToProperty}
Abe Heidebrecht
When you say "bind to another property on the object", which object are you talking about? The display element or the object within the data context?
Drew Noakes
It turns out, as I revisit this, that the object in question is the object upon which the binding is being applied. I tried using <Button Tag="{Binding RelativeSource={RelativeSource Self}}" /> and looking in the debugger. The Tag property contained the button itself.
Drew Noakes
+13  A: 
Binding RelativeSource={
    RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemType}
}
...

The default attribute of RelativeSource is the Mode property. A complete set of valid values is given here (from MSDN):

  • PreviousData Allows you to bind the previous data item (not that control that contains the data item) in the list of data items being displayed.

  • TemplatedParent Refers to the element to which the template (in which the data-bound element exists) is applied. This is similar to setting a TemplateBindingExtension and is only applicable if the Binding is within a template.

  • Self Refers to the element on which you are setting the binding and allows you to bind one property of that element to another property on the same element.

  • FindAncestor Refers to the ancestor in the parent chain of the data-bound element. You can use this to bind to an ancestor of a specific type or its subclasses. This is the mode you use if you want to specify AncestorType and/or AncestorLevel.

Drew Noakes
Thanks for poitning out PreviousData! Exactly what i was looking for!
LnDCobra
+10  A: 

Here is the cheat-sheet that does help not being confused: http://www.nbdtech.com/Free/WpfBinding.pdf

-aj

ajdotnet
nice overview, thanks for the link!
David Schmitt
+3  A: 

It's worthy of note that for those stumbling across this thinking of Silverlight:

Silverlight offers a reduced subset only, of these commands

Matthew Black
Yep, I was looking for SL support also. Vote it up:https://connect.microsoft.com/VisualStudio/feedback/details/480603/findancestor-relativesource-should-be-available-in-silverlight
TravisWhidden
+2  A: 

I just posted another solution for accessing the DataContext of a parent element in Silverlight that works for me. It uses Binding ElementName.

Juve