2014-10-06 122 views
0

我已经定义了实现TriggerAction<UIElement>的类触发器。 在该课程内,我想访问ContentControl类型的上下文菜单的父级。 因此我在触发器类中定义了DependencyProperty类型:ContentControlWPF绑定到来自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)); 
    } 

这里,我想从触发类来访问ContentControlContextMenu

<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

+0

上下文菜单不在UI的可视化树中。它“飞越”你的用户界面并拥有自己的视觉树。 – Fratyx 2014-10-06 14:58:05

+0

我明白,我可以如何将它的可视化树绑定到我的UI中的另一个控件? – Jacob 2014-10-06 15:03:51

+2

您需要绑定到ContextMenu的PlacementTarget属性。这是上下文菜单中的元素可以到达可视树的路线。通常,如果您需要访问特定元素,则将Tag属性用作元素的临时存储,以便简化绑定。 [我相信这是关于这个问题的典型问题](http://stackoverflow.com/questions/3668654/relativesource-binding-from-a-tooltip-or-contextmenu)。如果它回答你的问题,我们可以将其标记为重复(不用担心)。如果没有,[编辑]并陈述原因。 – Will 2014-10-06 15:14:03

回答

1

问题是上下文菜单,装饰物,工具提示和其他元素不在应用程序的可视化树中,它们位于其他一层。为了解决这个问题,我试图做的是使用datacontext来创建绑定,为视图模型创建绑定,这个视图模型可以是菜单的视图模型(datacontext)或窗口的视图模型,可能是MainViewModel

这样你可以有,列表或观察的集合也许,MenuViewModel S(与属性IsSelected),并在名为SelectedMenu主视图模型的项目或者类似的一些事情。并根据视图模型值/数据更改项目模板或数据模板。希望这个提示帮助。