2013-02-18 10 views
6

問題はRelativeSourceは次の場合には機能しません。私はバインディングにブレークポイントを設定した場合、私はエラーを取得します。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"; 
} 

Silverlightを使用します。

System.Exception: BindingExpression_CannotFindAncestor.

私はElementName=LayoutRootの代わりRelativeSourceを使用する場合は、すべてがOKになります。

なぜ相対ソースバインディングが機能しないのですか?

答えて

6

ポップアップはContextMenu、ToolTipコントロールと似ていますが、VisualTreeに追加されません。このためには、ここであなたもPlacementTargetを指定する必要があります、私はこれがされたContextMenuやツールチップの場合のようにhelp.Notことを願っています

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

のように行う必要があります。

+1

それはポップアップコントロールにとっては明らかです。 ComboBoxItemTemplateで相対ソースを使用する方法はありますか? –

-1

ポップアップはビジュアルツリーの一部ではありません。

相対的なソース "バインディングソース(MSDN)の位置を基準にしてその場所を指定することによってバインディングソースを取得または設定します"。ポップアップはそれを表示しているコントロールのビジュアルツリーの一部ではないので、ポップアップの外に何かを解決することはできません。

1

リソースを介して小さなハッキングをセットアップすることができます:DataContextを設定します。

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

他の人も触れたように、ポップアップはビジュアルツリーの一部ではないためです。代わりに、ポップアップのPlacementTargetプロパティを使用してビジュアルツリーに戻ることができます。

<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> 
関連する問題