RelativeSource and Popup

binding, data-binding, silverlight, wpf

Solution

Popup is like ContextMenu , ToolTip controls , They are not added to the VisualTree. For this you will have to do like

<Grid x:Name="LayoutRoot" Height="100" Width="200" Background="Black">
    <Popup Grid.Row="0"  x:Name="popup" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Mode=Self}}">
        <TextBlock Text="{Binding DataContext, ElementName=popup}" Background="Red" Width="30" Height="30" />
    </Popup>
</Grid>

public MainWindow()
    {
        InitializeComponent();
        DataContext = "abcd";
        popup.PlacementTarget = LayoutRoot; 
    }

I hope this will help.Not like in case of ContextMenu or Tooltip , here you will also have to specify the PlacementTarget.

Problem

The problem is that `RelativeSource` does not work in the following case. I use silverlight 5. ``` //From MainPage.xaml <Grid x:Name="LayoutRoot" Background="White" Height="100" Width="200"> <Popup IsOpen="True"> <TextBlock Text="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType=Grid}}" /> </Popup> </Grid> //From MainPage.xaml.cs public MainPage() { InitializeComponent(); DataContext = "ololo"; } ``` If I set a breakpoint on the binding, I'll get Error: System.Exception: BindingExpression_CannotFindAncestor. If I use `ElementName=LayoutRoot` instead of `RelativeSource`, everything will be OK. Why does the relative source binding not work?

Original source