我已经定义了实现TriggerAction<UIElement>
的类触发器。 在该课程内,我想访问ContentControl
类型的上下文菜单的父级。 因此我在触发器类中定义了DependencyProperty
类型:ContentControl
。WPF绑定到来自ContextMenu的元素
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的可视化树中。它“飞越”你的用户界面并拥有自己的视觉树。 – Fratyx 2014-10-06 14:58:05
我明白,我可以如何将它的可视化树绑定到我的UI中的另一个控件? – Jacob 2014-10-06 15:03:51
您需要绑定到ContextMenu的PlacementTarget属性。这是上下文菜单中的元素可以到达可视树的路线。通常,如果您需要访问特定元素,则将Tag属性用作元素的临时存储,以便简化绑定。 [我相信这是关于这个问题的典型问题](http://stackoverflow.com/questions/3668654/relativesource-binding-from-a-tooltip-or-contextmenu)。如果它回答你的问题,我们可以将其标记为重复(不用担心)。如果没有,[编辑]并陈述原因。 – Will 2014-10-06 15:14:03