在 DataTemplate 中查找祖先

Find ancestor in DataTemplate

我正在尝试在 DataTemplate 元素 TextEdit 上显示弹出窗口(来自 DevExpress), according to this and this 我创建了类似内容的主题:

<DataTemplate x:Key="SomeTemplate">
    <dxe:TextEdit x:Name="SomeTextEdit" Text="{Binding DisplayText, Mode=OneWay}" 
                    EditMode="InplaceInactive">
        <dxe:TextEdit.ContextMenu>
            <ContextMenu/>
        </dxe:TextEdit.ContextMenu>
        <Popup PlacementTarget="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type dxe:TextEdit}}}" IsOpen="{Binding IsKeyboardFocused, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type dxe:TextEdit}}, Mode=OneWay}">
            <TextBlock Background="White">
                <TextBlock.Text>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</TextBlock.Text>
            </TextBlock>
        </Popup>
    </dxe:TextEdit>
</DataTemplate>

它不起作用,在诊断工具事件中 window 我收到消息:

Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='DevExpress.Xpf.Editors.TextEdit', AncestorLevel='1''. BindingExpression:(no path); DataItem=null; target element is 'Popup' (Name=''); target property is 'PlacementTarget' (type 'UIElement')

这是为什么?

Popup 将使用不同的 VisualTree,我们不能使用 RelativeSource 绑定方法从主 VisualTree 中查找元素。您仍然可以通过 [=15= 设置 PlacementTarget ] 捆绑。你可以这样使用,

<Popup IsOpen="{Binding PlacementTarget.IsKeyboardFocused, RelativeSource={RelativeSource Mode=Self},Mode=OneWay}" PlacementTarget="{Binding ElementName=SomeTextEdit}">
    <TextBlock Background="White" Text="Hi" />
</Popup>