2010-11-22 15 views
1

私は動的にコンテキストメニューを作成しており、メニュー項目には子があります。 サブメニューの周りは最初に表示されますが、親メニューだけが表示された後はサブメニューに表示されます。子サブメニューは、表示されないコンテキストメニューにバインドされたコレクション内にあります。WPF MVVM Dynamic SubMenuバインディングの問題

VMMenuItemsは、私の見解モデルのプロパティであり、

ObservableCollection<MenuItemViewModel> 

リストビュー内のデータがVMMenuItemsが完全に再構築されるたびに変化しています。 サブメニューは、既存のMenuItemViewModelのChildrenに別のMenuItemViewModelを追加するだけです。 毎回サブメニューを作成する方法に関するアイデアはありますか?

コードが

<Window.Resources>   
    <HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}" 
           ItemsSource="{Binding Path=Children}"> 
     <ContentPresenter Content="{Binding Path=MenuText}" /> 
    </HierarchicalDataTemplate> 
</Window.Resources> 

<ListView.ContextMenu> 
     <ContextMenu ItemsSource="{Binding Path=VMMenuItems> 
      <ContextMenu.ItemContainerStyle> 
       <Style TargetType="{x:Type MenuItem}">          
       <Setter Property="Command" Value="{Binding Command}"/> 
        <Setter Property="CommandParameter" Value="{Binding MenuText}"/> 
          </Style> 
         </ContextMenu.ItemContainerStyle> 
        </ContextMenu>      
       </ListView.ContextMenu> 

public class MenuItemViewModel : ViewModel 
{ 
    public MenuItemViewModel() 
    { 
     Children = new ObservableCollection<MenuItemViewModel>(); 
    } 


    private string _menuText; 
    public string MenuText 
    { 

     get { return _menuText; } 

     set 
     { 
      _menuText = value; 
      OnPropertyChanged("MenuText"); 
     } 
    } 


    private bool _isEnabled; 
    public bool IsEnabled 
    { 
     get { return _isEnabled; } 

     set 
     { 
      _isEnabled = value; 
      OnPropertyChanged("IsEnabled"); 
     } 
    } 


    private ICommand _command; 
    public ICommand Command 
    { 
     get { return _command; } 

     set 
     { 
      _command = value; 
      OnPropertyChanged("Command"); 
     } 
    } 

    private ObservableCollection<MenuItemViewModel> _children; 
    public ObservableCollection<MenuItemViewModel> Children 
    { 
     get { return _children; } 

     set 
     { 
      _children = value; 
      OnPropertyChanged("Children"); 
     } 
    } 
+0

ああ、これは.NET 3.5 – mike

答えて

2

私はHierarchicalDataTemplateを使用せず、すべてここにContextMenu.ItemContainerStyleに入れる必要がありました。 私の他の方法がうまくいかなかった理由はよく分かりません。 それが動作しない理由はたぶん他の誰かが私に言うことができる...

<ContextMenu.ItemContainerStyle> 
    <Style TargetType="{x:Type MenuItem}"> 
    <Setter Property="Header" Value="{Binding MenuText}"/> 
    <Setter Property="ItemsSource" Value="{Binding Path=Children}"/> 
    <Setter Property="Command" Value="{Binding Command}"/> 
    <Setter Property="CommandParameter" Value="{Binding MenuText}"/> 
    </Style> 
</ContextMenu.ItemContainerStyle> 
0

私はまだ自分自身をこれに新たなんだと、なぜ私は正確にそれをテストすることなく、確かなことは知っているかしていないが、私はそれがでChildrenコレクションを置き換えるに関係していると考えています全く新しいコレクション。コレクションの再バインドが必要になると思います。アイテムが既存のコレクションに追加/削除される方が良いでしょう。これにより、適切なバインディング通知がトリガーされます。今、バインディングは、Children.set呼び出しで置き換えられているそのコレクションの特定のインスタンスです。お役に立てれば。

+0

ああであり、そしてあなたは、コレクション全体を設定する必要がある場合、私はあなたが処理するために必要だと思います子プロパティのPropertyChanged通知は、再バインドを実行するビューのコードの背後にあります。 – brader24

+0

私はコレクションとサブコレクションからすべてのアイテムを削除し、新しいMenuItemViewModelオブジェクトを再追加しましたが、私は同じ結果を得ました。サブメニューは2度ありません。 – mike

+0

プロパティが変更されたときのように、トップレイヤーの変更のみが表示され、サブ/子は表示されません。再帰的にすべてのコレクションを通過させるような方法はありますか? – mike

関連する問題