8

问题是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";
}

如果我在绑定上设置断点,我会得到错误:

System.Exception:BindingExpression_CannotFindAncestor。

如果我使用ElementName=LayoutRoot而不是RelativeSource,一切都会好起来的。

为什么相对源绑定不起作用?

4

4 回答 4

9

Popup 就像 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

正如其他人所提到的,这是因为 Popup 不是视觉树的一部分。相反,您可以使用 Popup 的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 回答
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 回答
-1

弹出窗口不是可视化树的一部分。

相对源“通过指定绑定源相对于绑定目标 (MSDN) 的位置来获取或设置绑定源”。由于弹出窗口不是显示它的控件的可视树的一部分,因此它将无法解析弹出窗口之外的任何内容。

于 2013-02-18T16:37:52.197 回答