在 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>
我正在尝试在 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>