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
查看:TopMenuView.xaml