WPF ObservableCollection和menuItems

时间:2016-11-15 09:24:17

标签: wpf

在此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);
        }
    }
}

1 个答案:

答案 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]);

它应该找到并删除指定的项目。