Почему не происходит обновление ObservableCollection <MenuItem>на RaisePropertyChanged? - PullRequest
1 голос
/ 01 февраля 2011

В моем приложении WPF у меня есть ObservableCollection<MenuItem>, который динамически обновляется, чтобы содержать различные элементы категории. Когда экран загружается, все в порядке, но смена коллекции, когда экран открыт, и вызов RaisePropertyChanged для коллекции не обновляет контекстное меню.

Похоже, что контекстное меню загружается только при загрузке элемента управления и не может быть изменено динамически?

ОБНОВЛЕНИЕ: Этот код динамически создает подконтекстное меню, основанное на элементах, которые пользователь добавляет или удаляет. Мой вопрос здесь заключается в том, почему геттер DocumentExplorerMenuOptions не вызывается при вызове RaisePropertyChanged? Я вижу, как вызывается RaisePropertyChanged, но никогда не запрашивается получатель.

    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 ]

2 голосов
/ 01 февраля 2011

Свойство ObservableCollection настроено неправильно. Вы добавили в получатель этого свойства все, что на самом деле не работает. Попробуйте создать закрытый член, создать экземпляр этого в самом конструкторе и добавить туда эти записи. В этом случае вы как бы повторно создаете экземпляр ObservableCollection для каждой загрузки View, потому что getter может вызываться много раз.

1 голос
/ 02 февраля 2011

Эта проблема была решена по аналогичному запросу мной. Надеюсь, что это решит вашу проблему.

ContextMenu, привязанное к ObservableCollection не обновляет данные

1 голос
/ 01 февраля 2011

Это странно, если я правильно читаю ваш код. Есть ли причина, по которой вы не можете поддерживать коллекцию и изменять ее (в отличие от воссоздания), чтобы вам вообще не нужно было RaisePropertyChanged? Это то, что делает ObservableCollection(of T), в конце концов.

Пока я читаю, это может быть IEnumerable(of T).

(Создание нового ObservableCollection(of T) в получателе свойств почти всегда является ошибкой. ReadOnlyObservableCollection(of T) имеет гораздо больше смысла в этом контексте.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...