8

問題はRelativeSource、次の場合には機能しないことです。私はSilverlight5を使用しています。

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

バインディングにブレークポイントを設定すると、エラーが発生します。

System.Exception:BindingExpression_CannotFindAncestor。

ElementName=LayoutRootの代わりに使用すればRelativeSource、すべて問題ありません。

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

4

4 に答える 4

9

ポップアップはContextMenu、ToolTipコントロールのようなもので、VisualTreeには追加されません。このためにあなたは好きなことをしなければならないでしょう

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

これがお役に立てば幸いです。ContextMenuやTooltipの場合とは異なり、ここでもPlacementTargetを指定する必要があります。

于 2013-02-18T16:41:35.547 に答える
2

あなたは小さなハックをすることができます:リソースを介してDataContextをセットアップします。

<Grid.Resources>
    <Style TargetType="TextBlock">
        <Setter Property="DataContext" Value="{Binding ElementName=myGrid, Path=DataContext}" />
    </Style>
</Grid.Resources>
于 2013-06-27T13:45:29.223 に答える
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>
于 2013-06-27T14:42:37.920 に答える
-1

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

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

于 2013-02-18T16:37:52.197 に答える