首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF ContextMenu的问题:如何设置ContextMenu的DataContext?

WPF ContextMenu的问题:如何设置ContextMenu的DataContext?
EN

Stack Overflow用户
提问于 2013-02-23 05:30:25
回答 4查看 33.8K关注 0票数 34

我在弄清楚如何在ContextMenu上设置正确的DataContext时遇到了一些麻烦。

我有一个视图模型的集合,这些模型是ItemsControl的来源。每个视图模型都有一个项目集合,这些项目也是另一个ItemsControl的源。每个项目都用于绘制具有ContextMenu的图像。ContextMenuMenuItems需要绑定到视图模型上的命令,但是ContextMenuPlacementTarget指向单个项目。

我的Xaml看起来像这样:

代码语言:javascript
运行
复制
<ItemsControl ItemsSource="{Binding Markers"}>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding Items}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Image>
                            <Image.ContextMenu>
                                <ContextMenu>
                                     <MenuItem Header="Edit" Command="{Binding EditCommand}" />
                                </ContextMenu>
                            </Image.ContextMenu>
                        </Image>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

如何将ContextMenuDataContext设置为项目对应的父视图模型?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-23 05:47:07

ContextMenu位于可视化树的外部。下面是应该为您提供数据上下文的xaml:

代码语言:javascript
运行
复制
<ItemsControl ItemsSource="{Binding Markers}" Tag="{Binding ElementName=outerControl, Path=DataContext}">
   ...
   <ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
      <MenuItem Header="Edit"
                Command="{Binding EditCommand}" />
   </ContextMenu>
   ...
</ItemsControl>

这个post解释了这是如何工作的。

票数 47
EN

Stack Overflow用户

发布于 2015-11-03 04:08:19

您可以使用markupextension:

代码语言:javascript
运行
复制
using System;
using System.Windows.Controls;
using System.Windows.Markup;
using System.Xaml;

[MarkupExtensionReturnType(typeof(ContentControl))]
public class RootObject : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var rootObjectProvider = (IRootObjectProvider)serviceProvider.GetService(typeof(IRootObjectProvider));
        return rootObjectProvider?.RootObject;
    }
}

它可以让你做到:

代码语言:javascript
运行
复制
<ItemsControl ItemsSource="{Binding Markers}">
   ...
   <ContextMenu DataContext="{Binding DataContext, Source={local:RootObject}}">
      <MenuItem Header="Edit"
                Command="{Binding EditCommand}" />
   </ContextMenu>
   ...
</ItemsControl>
票数 17
EN

Stack Overflow用户

发布于 2016-07-19 18:49:51

我不喜欢使用标签。我更喜欢附加属性。

您需要添加附加属性:

代码语言:javascript
运行
复制
public static readonly DependencyProperty DataContextExProperty =
   DependencyProperty.RegisterAttached("DataContextEx",
                                       typeof(Object), 
                                       typeof(DependencyObjectAttached));

public static Object GetDataContextEx(DependencyObject element)
{
    return element.GetValue(DataContextExProperty);
}

public static void SetDataContextEx(DependencyObject element, Object value)
{
    element.SetValue(DataContextExProperty, value);
}

在XAML中:

代码语言:javascript
运行
复制
<Button attached:DependencyObjectAttached.DataContextEx="{Binding ElementName=MyDataContextElement, Path=DataContext}">
    <Button.ContextMenu>
        <ContextMenu DataContext="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.(attached:DependencyObjectAttached.DataContextEx)}">
        </ContextMenu>
    </Button.ContextMenu>
</Button>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15033522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档