【问题标题】:WPF: Adding a Command to each MenuItem in a data-bound dynamic MenuWPF:向数据绑定动态菜单中的每个菜单项添加命令
【发布时间】:2011-05-02 10:23:12
【问题描述】:

如何向数据绑定菜单中的每个项目添加命令?基本上,我有这样的东西:

     <MenuItem Header="View" ItemsSource="{Binding ...}" />

对于菜单中的每一项,我需要根据它的 DataContext 给它一个命令。我无法使用 ItemTemplate,因为模板位于生成的 MenuItem 容器中。哦,而且命令需要有输入手势,所以需要在菜单打开之前生成。

有没有更好的方法来做到这一点?也许我应该在代码隐藏中添加/删除项目?

【问题讨论】:

  • 呃,你能举一个更好的例子吗?我不完全明白你到底想要什么
  • 您可以尝试使用 CommandParameter 属性并将每个菜单项绑定到相同的命令。所以你可以根据不同的参数来实现执行的事件。
  • @Howard - 这比我接受的答案更干净,但是如何设置命令参数?
  • CommandParameter 是 MenuItem 中的一个属性。您可以设置修复参数,也可以绑定到您的动态参数。在执行的事件中,您可以访问您在此属性中设置的参数。

标签: .net wpf xaml data-binding menuitem


【解决方案1】:

请记住,MenuItem(和 Menu)只是 ItemsControls。这意味着您可以将任何东西的集合绑定到它。换句话说,您可以将其绑定到任何具有 ICommand 的集合(也就是您的视图模型)。

但我们不想要那个,我们想要 MenuItems 对吧?因此,您可以做的是将要绑定的集合绑定到您在幕后创建的 MenuItem 集合。

但是,如果我们能提供帮助,我们真的不希望在代码隐藏中实例化控件。它导致可测试性差,而且通常很笨重。

因此,我们可以做的是绑定到您的业务对象的集合,但使用 custom TypeConverter 将该列表转换为正确绑定到每个对象的 MenuItem 列表

这种方法的真正好处在于,无论您的菜单结构有多深,它都能正常工作。 Typeconverter 可以遍历您的视图模型并递归添加新的绑定,这些绑定又使用相同的类型转换器

另一种选择是为您的菜单项视图模型创建一个 DataTemplate,该模型又包含一个 MenuItem,但我不完全确定如何使用该方法处理手势。不过这可能是可能的,而且这种方法也是递归的。

【讨论】:

  • 嗯...谢谢!我一直在使用 ValueConverters,以至于我完全忘记了类型转换器……是的,我尝试了 DataTemplate with MenuItem 方法,但这看起来很奇怪,因为它是菜单项中的一个菜单项。
  • 是的,我记得在某个地方读到过这可能是个问题。您可能已经知道这一点,但作为参考,这里是在代码中创建绑定的 HowTo 页面:msdn.microsoft.com/en-us/library/ms742863.aspx
猜你喜欢
  • 2012-12-15
  • 2010-11-03
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
相关资源
最近更新 更多