В моем приложении 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);
}