【问题标题】:WPF Bind to Element From ContextMenuWPF 从 ContextMenu 绑定到元素
【发布时间】: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 并说明原因。
  • 非常感谢您!是的,这是一个重复的问题,我们可以将其标记为重复。再次感谢您。

标签: c# wpf mvvm


【解决方案1】:

问题在于上下文菜单、装饰器、工具提示和其他元素不在应用程序的可视化树中,它们在其他层中。为了解决这个问题,我尝试做的是使用datacontext进行绑定,绑定到视图模型,这个视图模型可以是菜单的视图模型(datacontext),或者窗口的视图模型,可能是@ 987654321@等

通过这种方式,您可以拥有一个列表或可观察集合,其中可能包含MenuViewModels(具有属性IsSelected),以及主视图模型中名为SelectedMenu 的项目或类似的东西。并根据视图模型值/数据更改项目模板或数据模板。希望这些提示对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多