WPF:向数据绑定动态菜单中的每个菜单项添加命令



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

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

对于菜单中的每个项目,我需要根据它的DataContext给它一个Command。我不能使用ItemTemplate,因为模板是在生成的MenuItem容器内。哦,命令需要有输入手势,所以它们需要在菜单打开之前生成。

有更好的方法吗?也许我应该在代码隐藏中添加/删除项目?

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

但是我们不想要那个,我们想要菜单项,对吧?你能做的是将你要绑定的集合绑定到后台创建的MenuItems集合。

但是,如果可以的话,我们并不想在代码后面实例化控件。它会导致较差的可测试性,并且通常很笨拙。

所以我们可以做的是绑定到你的业务对象集合但是使用自定义TypeConverter将该列表转换为菜单项列表并正确绑定到每个对象

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

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

最新更新