【发布时间】:2014-11-30 20:16:19
【问题描述】:
我已经定义了实现TriggerAction<UIElement> 的类触发器。
在该类中,我想访问 ContentControl 类型的上下文菜单的父级。
所以我在触发器类中定义了DependencyProperty 类型:ContentControl。
public class MoveToEditModeTrigger : TriggerAction<UIElement>
{
protected override void Invoke(object parameter)
{
if (ContentControl == null) return;
Selector.SetIsSelected(ContentControl, false);
ContentControl.Focusable = true;
}
public ContentControl ContentControl
{
get { return (ContentControl)GetValue(ContentControlProperty); }
set { SetValue(ContentControlProperty, value); }
}
public static readonly DependencyProperty ContentControlProperty =
DependencyProperty.Register("ContentControl", typeof(ContentControl), typeof(MoveToEditModeTrigger), new FrameworkPropertyMetadata(null));
}
这是我想从触发器类访问的ContentControl 中的ContextMenu:
<ContentControl Name="contentControl">
<ContentControl.ContextMenu>
<ContextMenu>
<MenuItem Header="EditText">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<trigger:MoveToEditModeTrigger ContentControl="{Binding ElementName=contentControl}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</ContentControl.ContextMenu>
<RichTextBox x:Name="richtxtLeft" Focusable="True" />
</ContentControl>
问题是绑定失败,ContentControl 依赖属性保持为空。
我也这样做了,但没有成功:
ContentControl="{Binding RelativeSource={RelativeSource AncestorType=ContentControl, Mode=FindAncestor}}"
并且还尝试使用VisualTreeHalper 来查找ContentControl。
我也尝试绑定到ContentControl 内的RichTextBox,但没有任何结果。
请问,如何访问触发器类中的ContentControl?
【问题讨论】:
-
上下文菜单不在 UI 的可视化树中。它“飞过”您的 UI,并拥有自己的可视化树。
-
我明白了,如何从它的可视化树绑定到我的 UI 中的另一个控件?
-
您需要绑定到 ContextMenu 的 PlacementTarget 属性。这是上下文菜单中的元素可以到达可视化树的路径。通常,如果您需要访问特定元素,Tag 属性被用作元素的临时存储,以使绑定更简单。 I believe this is the canonical question on the subject。如果它回答了您的问题,我们可以将其标记为重复(不用担心)。如果没有,edit 并说明原因。
-
非常感谢您!是的,这是一个重复的问题,我们可以将其标记为重复。再次感谢您。