我有一个上下文菜单,我希望它的菜单项通过绑定填充。 以下代码可以使用
<Button>
<controlsInputToolkit:ContextMenuService.ContextMenu>
<controlsInputToolkit:ContextMenu ItemsSource="{Binding MenuItems}">
<controlsInputToolkit:ContextMenu.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</controlsInputToolkit:ContextMenu.ItemTemplate>
</controlsInputToolkit:ContextMenu>
</controlsInputToolkit:ContextMenuService.ContextMenu>
</Button>
但是有一个问题,ItemTemplate表示菜单项的文本区域,因此我知道不允许你设置图标
所以我尝试通过ItemContainerStyle进行绑定,如下例
<Button>
<controlsInputToolkit:ContextMenuService.ContextMenu>
<controlsInputToolkit:ContextMenu ItemsSource="{Binding MenuItems}">
<controlsInputToolkit:ContextMenu.ItemContainerStyle>
<Style TargetType="controlsInputToolkit:MenuItem">
<Setter Property="Header" Value="{Binding Name}"/>
</Style>
</controlsInputToolkit:ContextMenu.ItemContainerStyle>
</controlsInputToolkit:ContextMenu>
</controlsInputToolkit:ContextMenuService.ContextMenu>
</Button>
但银光似乎不喜欢那样
任何想法?
答案 0 :(得分:0)
我创建了一个上下文菜单programmatically,并将内容设置为MenuItem.Header属性似乎对图像效果很好。设置文字有lot examples。
答案 1 :(得分:0)
答案 2 :(得分:0)
我有同样的问题,虽然我没有找到我想要的答案,但我发现了一种能很好地满足我需求的解决方法。我以为你可能想看到它,即使是这么久以后。
看来,如果ItemsSource
类的ContextMenu
包含MenuItem
个对象,那么该图标就会很好地归属于它所属的位置。我和你一样,正在使用视图模型而不是将UI逻辑注入到我的视图模型类中。
我所做的是实现一个值转换器,将我的视图模型转换为MenuItem
个对象。看起来有点像这样:
<强> XAML:强>
<UserControl.Resources>
<local:DelegatedValueConverter
x:Key="LocalContextItemConverter"
Converting="OnBindingContextMenu" />
</UserControl.Resources>
...
<toolkit:ContextMenu
ItemsSource="{Binding ContextMenuItems, Converter={StaticResource LocalContextItemConverter}}" />
C#Code-Behind
private void OnBindingContextMenu(object sender, ValueConvertingEventArgs e)
{
var dataitems = e.Value as IEnumerable< NavigationItemViewModel >;
if (dataitems != null)
{
var items = dataitems.Select(data => new MenuItem()
{
Header = data.Title,
Icon = data.Icon,
Tag = data
}).ToList();
var handler = new RoutedEventHandler(this.OnContextMenuClick);
items.ForEach(item => item.Click += handler);
e.Result = items
}
}
private void OnContextMenuClick(object sender, RoutedEventArgs e)
{
}
<强>讨论强>
DelegatedValueConverter
是我详细描述的here,但它并不重要。您可以滚动自己的值转换器并使用它。
我的视图模型的Title
属性是一个字符串,而Icon
是Image
的一个实例。我使用菜单项的Tag
属性来保持对视图模型的引用,以便在单击事件期间可以引用其中的非可视数据。
这个解决方案很方便,因为它仍然在UI和视图模型之间提供了一些分离,尽管在这种情况下我更喜欢纯粹的声明性解决方案。
我希望这有帮助!