私のWPFアプリケーションでは、ObservableCollection<MenuItem>
が動的に更新され、さまざまなカテゴリ項目が含まれています。画面がロードされると、すべてが問題なく、画面が表示されている間にコレクションが変更され、コレクションのRaisePropertyChanged
を呼び出してもコンテキストメニューは更新されません。なぜObservableCollection <MenuItem>がRaisePropertyChangedで更新されませんか?
コンテキストメニューはコントロールの読み込み時にのみ読み込まれ、動的に変更することはできないようですか?
更新:このコードは、ユーザーが追加または削除しているアイテムに基づいてサブコンテキストメニューを動的に作成しています。私の質問は、RaisePropertyChangedが呼び出されているときにDocumentExplorerMenuOptionsゲッターが呼び出されないのはなぜですか?私は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);
}
私はあなたが記述している正確に何をしようとしています。カテゴリのリストは絶えず変化する可能性があり、コードの他の部分でアイテムが追加されたり削除されたりすると、常に利用可能なカテゴリのコンテキストサブメニューが更新されます。 – Kevin