WPF – 如何使用绑定创建菜单和子菜单

我正在尝试使用绑定创建动态菜单。 我的viewmodel我有一个包含标题和命令的对象列表。 但是,它不起作用。 我认为问题出在数据模板中。 请参阅下面的代码:

                   

结果仅显示第一个菜单。 子菜单没有显示,但它们在那里,因为有子项的菜单,箭头在菜单标题后打印。

任何人都可以在绑定上发现错误吗? 还是有什么建议吗?

仅供参考,MenuItems是一个MenuItemViewModel对象列表,它有一个标题和一个名为MenuItems的MenuItemViewModel对象(子菜单)列表。

对我来说,它适用于这个简单的模板:

         

这是完整的例子:

MainWindow.xaml:

                 

MainWindow.xaml.cs:

 using System; using System.Collections.ObjectModel; using System.Windows; using System.Windows.Input; namespace WpfApplication14 { public partial class MainWindow : Window { public ObservableCollection MenuItems { get; set; } public MainWindow() { InitializeComponent(); MenuItems = new ObservableCollection { new MenuItemViewModel { Header = "Alpha" }, new MenuItemViewModel { Header = "Beta", MenuItems = new ObservableCollection { new MenuItemViewModel { Header = "Beta1" }, new MenuItemViewModel { Header = "Beta2", MenuItems = new ObservableCollection { new MenuItemViewModel { Header = "Beta1a" }, new MenuItemViewModel { Header = "Beta1b" }, new MenuItemViewModel { Header = "Beta1c" } } }, new MenuItemViewModel { Header = "Beta3" } } }, new MenuItemViewModel { Header = "Gamma" } }; DataContext = this; } } public class MenuItemViewModel { private readonly ICommand _command; public MenuItemViewModel() { _command = new CommandViewModel(Execute); } public string Header { get; set; } public ObservableCollection MenuItems { get; set; } public ICommand Command { get { return _command; } } private void Execute() { // (NOTE: In a view model, you normally should not use MessageBox.Show()). MessageBox.Show("Clicked at " + Header); } } public class CommandViewModel : ICommand { private readonly Action _action; public CommandViewModel(Action action) { _action = action; } public void Execute(object o) { _action(); } public bool CanExecute(object o) { return true; } public event EventHandler CanExecuteChanged { add { } remove { } } } } 

生成的窗口如下所示:

屏幕截图

这非常简单,您可以将此代码用于嵌套菜单

ViewModel:TopMenuViewModel.cs

 public partial class TopMenuViewModel { public TopMenuViewModel() { TopMenuItems = new ObservableCollection { new MenuItem { Title = "File", PageName =typeof(OfficeListView).FullName, ChildMenuItems= { new MenuItem { Title = "New" }, new MenuItem { Title = "Open" }, new MenuItem { Title = "Save" } } }, new MenuItem { Title = "Edit" }, new MenuItem { Title = "Search" } }; } 

查看:TopMenuView.xaml