在此sample的基础上,我想以编程方式添加,删除菜单中的项目,例如以这种方式:
void ChangeItemSubitems()
{
// TODO: Add event handler implementation here.
MenuItems.Add(new MenuItemViewModel { Header = "delta" });
MenuItems[3].MenuItems = new ObservableCollection<MenuItemViewModel>();
MenuItems[3].MenuItems.Add(new MenuItemViewModel { Header = "delta 1" });
MenuItems[3].MenuItems.Add(new MenuItemViewModel { Header = "delta 2" });
MenuItems.Remove(MenuItems[1].MenuItems[0]);
}
只有高级别的项目添加工作正常,而不是子菜单,也不是删除。 这有什么不对?你能给我一些提示吗?感谢
编辑:对MenuItemViewModel进行更改
public class MenuItemViewModel : ViewModelBase
{
private readonly ICommand _command;
public MenuItemViewModel()
{
_command = new CommandViewModel(Execute);
}
public MenuItemViewModel(Action action)
{
_command = new CommandViewModel(action);
}
private string _header;
public string Header
{
get { return _header; }
set
{
_header = value;
RaisePropertyChangedEvent("Header");
}
}
public ObservableCollection<MenuItemViewModel> 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 ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChangedEvent(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
PropertyChanged(this, e);
}
}
}
答案 0 :(得分:0)
您的问题很可能是
public ObservableCollection<MenuItemViewModel> MenuItems { get; set; }
虽然ObservableCollection
会在项目更改时通知用户界面,但您的MenuItemViewModel
仍需要在集合本身更改时通知。所以试试
private ObservableCollection<MenuItemViewModel> _menuItems;
public ObservableCollection<MenuItemViewModel> MenuItems
{
get
{
return _menuItems;
}
set
{
_menuItems = value;
RaisePropertyChangedEvent("MenuItems");
}
}
编辑。 remove语句有一个不同的问题:
MenuItems.Remove(MenuItems[1].MenuItems[0]);
这会尝试从外部集合中删除内部子菜单项。但是,MenuItems[1].MenuItems[0]
不是MenuItems
的元素,因此Remove
在这种情况下应返回false
,而WPF肯定不会因未更改视图而出错。
请尝试以下方法:
MenuItems[1].MenuItems.Remove(MenuItems[1].MenuItems[0]);
它应该找到并删除指定的项目。