如何在WPF中的数据绑定菜单中处理单击事件

我有一个MenuItem,其中ItemsSource被数据绑定到一个简单的字符串列表,它显示正确,但我很难看到我如何处理它们的点击事件!

这是一个演示它的简单应用程序:

       

 using System.Collections.Generic; using System.Windows; namespace WPFDataBoundMenu { ///  /// Interaction logic for Window1.xaml ///  public partial class Window1 : Window { public List MyMenuItems { get; set;} public Window1() { InitializeComponent(); MyMenuItems = new List { "Item 1", "Item 2", "Item 3" }; DataContext = this; } private void MenuItem_Click(object sender, RoutedEventArgs e) { MessageBox.Show("how do i handle the other clicks?!"); } } } 

非常感谢!

克里斯。

  

代码背后..

 private void DataBoundMenuItem_Click(object sender, RoutedEventArgs e) { MenuItem obMenuItem = e.OriginalSource as MenuItem; MessageBox.Show( String.Format("{0} just said Hi!", obMenuItem.Header)); } 

事件将冒泡到公共处理程序。 然后,您可以使用Header文本或更好的DataContext属性来切换并根据需要执行操作

您可以让每个菜单项执行相同的命令,从而集中处理执行。 如果需要区分菜单项而不是实际的对象实例,也可以绑定命令参数:

      

假设MyMenuItems集合中每个项目的属性。 因此,您的命令执行处理程序将为单击的特定菜单项接收SomeProperty的值。

恕我直言更通用的事件处理程序,能够从itemssource获取项目

 private void DataBoundMenuItem_Click(object sender, RoutedEventArgs e) { // get menu item with ItemsSource bound var myItemsMenuItems = sender as MenuItem; // get submenu clicked item constructed from MyMenuItems collection var myItemsMenuSubItem = e.OriginalSource as MenuItem; // get underlying MyMenuItems collection item var o = myItemsMenuItems .ItemContainerGenerator .ItemFromContainer(myItemsMenuSubItem); // convert to MyMenuItems type ... in our case string var itemObj = o as (string); // TODO some processing } 

希望它能帮助smbd!

如果您想要一种更简单的方法来访问菜单项内容:

      

鳕鱼背后:

 private void MenuItem_Click(object sender, RoutedEventArgs e) { var item = ((MenuItem)e.OriginalSource).CommandParameter; }