2011-02-01 9 views
1

私の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); 
    } 

答えて

1

あなたのコードを正しく読んでいるなら、これは奇妙です。 RaisePropertyChangedをまったく必要としないように、コレクションを維持したり、コレクションを再作成したりすることができない理由はありますか?結局のところ、ObservableCollection(of T)はそうです。

私がそれを読んでいるので、IEnumerable(of T)であるかもしれません。

(プロパティのゲッターに新しい ObservableCollection(of T)を作成するには、ほとんど常に間違いです。 ReadOnlyObservableCollection(of T)は、そのコンテキストで多くの意味があります。)

2

のObservableCollectionプロパティが正しく設定されていません。そのプロパティのゲッターにすべてを追加しましたが、それは実際には機能しません。プライベートメンバーを作成し、コンストラクター自体でそのインスタンスをインスタンス化し、そこにそれらのエントリーを追加してみてください。この場合、getterが何度も呼び出されるため、ViewロードごとにObservableCollectionを再インスタンス化することができます。

+0

私はあなたが記述している正確に何をしようとしています。カテゴリのリストは絶えず変化する可能性があり、コードの他の部分でアイテムが追加されたり削除されたりすると、常に利用可能なカテゴリのコンテキストサブメニューが更新されます。 – Kevin

関連する問題