2013-02-18 15 views
6

Il problema è che RelativeSource non funziona nel seguente caso. Io uso silverlight 5.RelativeSource e Popup

//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"; 
} 

Se ho impostato un punto di interruzione sulla vincolante, vado a prendere Errore:

System.Exception: BindingExpression_CannotFindAncestor.

Se uso ElementName=LayoutRoot invece di RelativeSource, tutto sarà OK.

Perché il binding della relativa fonte non funziona?

risposta

6

Popup è come ContextMenu, Controlli comandi, Non vengono aggiunti al VisualTree. Per questo si dovrà fare come

<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; 
    } 

Spero che questo vi help.Not come nel caso di ContextMenu o Tooltip, qui si avrà anche per specificare il PlacementTarget.

+1

Ok. Questo è chiaro per il controllo popup. C'è un modo di utilizzare la sorgente relativa in ComboBoxItemTemplate? –

-1

I popup non fanno parte dell'albero visivo.

Sorgente relativa "Ottiene o imposta la sorgente di associazione specificandone la posizione rispetto alla posizione della destinazione vincolante (MSDN)". Poiché i popup non fanno parte dell'albero visivo del controllo che lo sta mostrando, non sarà in grado di risolvere alcunché al di fuori del popup.

1

È possibile effettuare piccole modifiche: configurare DataContext tramite risorse.

<Grid.Resources> 
    <Style TargetType="TextBlock"> 
     <Setter Property="DataContext" Value="{Binding ElementName=myGrid, Path=DataContext}" /> 
    </Style> 
</Grid.Resources> 
2

Come altri hanno già detto, è perché il Popup non fa parte dell'albero visivo. Invece, è possibile utilizzare la proprietà PlacementTarget di Popup per tornare all'albero visivo:

<Grid x:Name="LayoutRoot" Background="White" Height="100" Width="200"> 
    <Popup IsOpen="True"> 
     <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Popup}}, 
            Path=PlacementTarget.DataContext}" /> 
    </Popup> 
</Grid>