【发布时间】:2021-07-29 13:48:37
【问题描述】:
我正在尝试将ContextMenu 添加到ListBoxItem,但Click 事件未触发。
我尝试了ContextMenu.MenuItem.Click 事件。
我也尝试绑定Command,但是在输出窗口中出现绑定错误,如下:
“无法通过引用 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1'' 找到绑定源。BindingExpression:Path=NavigateCommand;”
这是完整的示例代码。
XAML
<ListBox>
<ListBoxItem>1</ListBoxItem>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}"
BasedOn="{StaticResource {x:Type ListBoxItem}}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu MenuItem.Click="ContextMenu_Click">
<MenuItem Header="Navigate"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window, AncestorLevel=1}, Path=NavigateCommand}"
Click="NavigateItemClick" />
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
代码隐藏
public MainWindow()
{
InitializeComponent();
NavigateCommand = new DelegateCommand(Navigate);
}
public DelegateCommand NavigateCommand { get; set; }
private void Navigate()
{
MessageBox.Show("Command Worked");
}
private void NavigateItemClick(object sender, RoutedEventArgs e)
{
MessageBox.Show("Item Click Worked");
}
private void ContextMenu_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Any Item click Worked");
}
有没有办法调用Click 事件处理程序或绑定Command?
【问题讨论】:
-
我认为没有必要编写“hackish”代码。我认为你应该考虑改进你的代码。上下文菜单应该只在其上下文中起作用,因此命名为上下文菜单。当您右键单击代码编辑器时,您将找不到例如“打开文件”菜单项 - 这将脱离上下文。菜单的上下文是实际项目。因此,命令应该在项目的数据模型中定义(因为上下文菜单应该只定义以项目为目标的命令)。
-
@BionicCode 你能给我一个正确使用的例子吗?例如,我的列表框由我可以打开的窗口名称列表组成。当我右键单击并打开相关窗口时,它脱离了上下文。或者你能给我一个没有断章取义的例子吗
-
我已经发布了一个例子。您可以看到解决方案简单直观。无需“滥用” Tag 属性或定义任何 MenuItem 样式来附加事件处理程序。
标签: c# wpf xaml contextmenu listboxitem