我想在列表框中的项目中添加上下文菜单。通常,答案是将contextmenu添加到项模板的根目录。但是,我使用的是模板选择器,因此正在使用多个模板,具体取决于列表框中每个项目的数据。这意味着我需要为每个模板添加相同的contextmenu定义,这不是很吸引人。
一种解决方案是将datatemplate包装在ContentControl中,这将为上下文菜单定义提供一个位置。但是,我认为这会增加不必要的布局开销。
我尝试的另一个解决方案是将ContextMenu添加到资源字典中,但我相信这最终会在所有用途中共享相同的对象实例,并且由于ContextMenu的实现方式,这也不起作用。
第三种解决方案是使用Loaded
事件来调用一个适当填充上下文菜单的函数。但是,这最终会将大量应该在XAML中的代码移动到代码中,并且看起来非常难看。如果有某种方法在xaml中定义上下文菜单,然后只是从代码中引用它,我会发现它很有吸引力,但我不太明白该怎么做。
在模板选择器中跨模板共享相同ContextMenu的正确方法是什么?
这是ContentControl方法,但最终会为每个项目添加两个内容控件:
<ListBox.ItemTemplate>
<DataTemplate>
<ContentControl>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu Loaded="ContextMenu_Loaded">
<toolkit:MenuItem Header="Delete"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<ContentControl ContentTemplate="{StaticResource MyTemplate}" Content="{Binding}"/>
</ContentControl>
</DataTemplate>
</ListBox.ItemTemplate>
答案 0 :(得分:1)
如何将ContextMenu添加到TemplateSelector?
<ListBox ItemsSource="{Binding}">
<ListBox.Resources>
<DataTemplate x:Key="MyTemplate">
<StackPanel>
<TextBlock Text="{Binding}" />
</StackPanel>
</DataTemplate>
</ListBox.Resources>
<ListBox.ItemTemplate>
<DataTemplate>
<local:CustomTemplateSelector Content="{Binding}">
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="Delete"
Click="MenuItem_Click" />
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<local:CustomTemplateSelector.TemplateOne>
<DataTemplate>
<ContentControl Content="{Binding}"
ContentTemplate="{StaticResource MyTemplate}"
Foreground="Blue" />
</DataTemplate>
</local:CustomTemplateSelector.TemplateOne>
<local:CustomTemplateSelector.TemplateTwo>
<DataTemplate>
<ContentControl Content="{Binding}"
ContentTemplate="{StaticResource MyTemplate}"
Foreground="Red" />
</DataTemplate>
</local:CustomTemplateSelector.TemplateTwo>
<local:CustomTemplateSelector.TemplateThree>
<DataTemplate>
<ContentControl Content="{Binding}"
ContentTemplate="{StaticResource MyTemplate}"
Foreground="Yellow" />
</DataTemplate>
</local:CustomTemplateSelector.TemplateThree>
</local:CustomTemplateSelector>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我跑了这个,它对我有用 - 尝试一下,让我知道这是否是你正在寻找的效果。