为什么我的ObservableCollection <menuitem>不会在RaisePropertyChanged上更新?</menuitem>

时间:2011-02-01 20:10:01

标签: c# wpf binding

在我的WPF应用中,我有一个ObservableCollection<MenuItem>,它会动态更新以包含各种类别项目。当屏幕加载时,一切都很好,但在屏幕启动时更改集合,并且为集合调用RaisePropertyChanged不会更新上下文菜单。

看来可能上下文菜单只在控件加载时加载,不能动态更改?

更新:此代码根据用户添加或删除的项目动态创建子上下文菜单。我的问题是为什么在调用RaisePropertyChanged时不调用DocumentExplorerMenuOptions getter?我看到RaisePropertyChanged被调用,但getter永远不会被要求任何东西。

    public ObservableCollection<MenuItem> DocumentExplorerMenuOptions {
        get {
            return new ObservableCollection<MenuItem> {                     
                new MenuItem(localizationProvider.Takeoff) {
                    Command = new DelegatingCommand(x => windowManager.ShowTakeoffWithGrid(context, selectedDocument, documentBagTasks))
                 },
                new MenuItem(localizationProvider.TakeoffImage) {
                    Command = new DelegatingCommand(x => windowManager.ShowTakeoff(context, selectedDocument, documentBagTasks))
                 },
                 ClassificationMenuItem
            };
        }
    }

    MenuItem classificationMenuItem;
    public MenuItem ClassificationMenuItem {
        get { return classificationMenuItem; }
        set { classificationMenuItem = value; }
    }

    void BuildClassificationsContextMenuItem(ICategoryBag categoryBag) {
        ClassificationMenuItem = new MenuItem(localizationProvider.ClassifyAs); 

        if (categoryBag == null) return;
        foreach (var category in (from category in categoryBag.Categories select category).OrderBy(x => x.Name)) {
            AddCategoryMenuItem(category);
        }
        RaisePropertyChanged(DocumentExplorerMenuOptionsPropertyName);
    }

    void RemoveCategoryMenuItem(Category category) {
        ClassificationMenuItem.Children.RemoveAll(x => x.Text == category.Name);
        RaisePropertyChanged(DocumentExplorerMenuOptionsPropertyName);
    }

    void AddCategoryMenuItem(Category category) {
        var categoryMenuItem = new MenuItem(category.Name);
        ClassificationMenuItem.Children.Add(categoryMenuItem);
        foreach(var value in category.Values) {
            categoryMenuItem.Children.Add(new MenuItem(value.Name) { Command = new DelegatingCommand(x => classifier.Classify(new ClassificationArguments(category, value, new List<Document>(documentExplorer.SelectedDocuments).ToArray()))) });
        }
        RaisePropertyChanged(DocumentExplorerMenuOptionsPropertyName);
    }

3 个答案:

答案 0 :(得分:2)

未正确设置ObservableCollection属性。您已将所有内容添加到该属性的getter中,但实际上并不起作用。尝试创建一个私有成员并在构造函数本身上实例化它并在那里添加这些条目。在这种情况下,您可以为每个View加载重新实例化ObservableCollection,因为getter可以被多次调用。

答案 1 :(得分:1)

如果我正确地阅读您的代码,这很奇怪。您是否有理由无法维护集合并对其进行修改(而不是重新创建集合),因此您根本不需要RaisePropertyChanged?毕竟,这就是ObservableCollection(of T)所做的。

在我阅读时,它可能也是IEnumerable(of T)

(在属性getter中创建一个新的ObservableCollection(of T)几乎总是一个错误。ReadOnlyObservableCollection(of T)在这种情况下更有意义。)

答案 2 :(得分:1)

此问题已在我的类似查询中得到解决。希望这可以解决您的问题。

ContextMenu bound to ObservableCollection<MenuItem> does not refresh data