2013-02-18 5 views
6

Das Problem ist, dass RelativeSource im folgenden Fall nicht funktioniert. Ich benutze Silverlight 5.RelativeSource und 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"; 
} 

Wenn ich einen Haltepunkt auf der Bindung eingestellt, ich Fehler bekommen:

System.Exception: BindingExpression_CannotFindAncestor.

Wenn ich ElementName=LayoutRoot anstelle von RelativeSource, wird alles in Ordnung sein.

Warum funktioniert die relative Quellenbindung nicht?

Antwort

6

Popup ist wie ContextMenu, ToolTip-Steuerelemente, sie sind nicht zu VisualTree hinzugefügt. Dazu werden Sie sich wie

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

zu tun haben, ich hoffe, das ist wie bei ContextMenu oder Tooltip help.Not wird, hier finden Sie auch die Placement angeben.

+1

Ok. Das ist für die Popup-Kontrolle klar. Gibt es eine Möglichkeit, relative Quelle in ComboBoxItemTemplate zu verwenden? –

-1

Popups sind nicht Teil des visuellen Baums.

Relative Quelle "Ruft die Bindungsquelle ab oder legt diese fest, indem sie ihre Position relativ zur Position des Bindungsziels (MSDN) angibt". Da Popups nicht Teil der visuellen Struktur des Steuerelements sind, das sie anzeigt, kann sie nichts außerhalb des Popups auflösen.

1

Sie können kleine Hack: Setup DataContext über Ressourcen.

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

Wie andere erwähnt haben, liegt es daran, dass das Popup nicht Teil des visuellen Baums ist. Stattdessen können Sie die Eigenschaft PlacementTarget des Popup-Objekts verwenden, um zum visuellen Baum zurückzukehren:

<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> 
Verwandte Themen