How to set DataContext to self

c#, wpf, xaml

Solution

You should be able to bind to the user control the same way as you do to the window:

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1,AncestorType=UserControl}}">

What you have tried was referring to the relative source `Self` from the `TextBox`. However, in that context, `Self` refers to the `TextBox`, not to the enclosing user control.

Problem

My UserControl requires binding to the ancestor (the ancestor being the MainWindow) and to itself (it's code behind). To bind to the ancestor, I'm using ``` DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1,AncestorType=Window}}"> ``` To bind a control to the code behind (and thus using the 'local' DataContext), I'm using ``` <TextBlock Text ="{Binding MyUC3Property}" Name="MyName" /> ``` and in the code behind, setting it like ``` this.MyName.DataContext = this; ``` The above works fine, where I can bind to the codebehind and to the ancestor. Now, I still want to bind to the code behind and the ancestor but set the DataContext in the XAML only (if possible). I've tried ``` <TextBlock Text ="{Binding MyUC3Property}" DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}" /> ``` and ensured the constructor does not set the DataContext (since I want it all done in the XAML) - (although even if I do set `this.DataContext = this;` the error persists) and the output window tells me there is a binding error. System.Windows.Data Error: 40 : BindingExpression path error: 'MyUC3Property' property not found on 'object' ''TextBlock' (Name='')'. BindingExpression:Path=MyUC3Property; DataItem='TextBlock' (Name=''); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String') I guess I'm missing something obvious, but I can't tell what.

Original source

Related problems