我在弄清楚如何在ContextMenu上设置正确的DataContext时遇到了一些麻烦。
我有一个视图模型的集合,这些模型是ItemsControl的来源。每个视图模型都有一个项目集合,这些项目也是另一个ItemsControl的源。每个项目都用于绘制具有ContextMenu的图像。ContextMenu中MenuItems需要绑定到视图模型上的命令,但是ContextMenu的PlacementTarget指向单个项目。
我的Xaml看起来像这样:
<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>如何将ContextMenu的DataContext设置为项目对应的父视图模型?
发布于 2013-02-23 05:47:07
ContextMenu位于可视化树的外部。下面是应该为您提供数据上下文的xaml:
<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解释了这是如何工作的。
发布于 2015-11-03 04:08:19
您可以使用markupextension:
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;
}
}它可以让你做到:
<ItemsControl ItemsSource="{Binding Markers}">
...
<ContextMenu DataContext="{Binding DataContext, Source={local:RootObject}}">
<MenuItem Header="Edit"
Command="{Binding EditCommand}" />
</ContextMenu>
...
</ItemsControl>发布于 2016-07-19 18:49:51
我不喜欢使用标签。我更喜欢附加属性。
您需要添加附加属性:
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中:
<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>https://stackoverflow.com/questions/15033522
复制相似问题