2017-08-30 18 views
2

注:私自身のビューモデルを使用したいので、この質問はWPF - How can I create menu and submenus using bindingとは異なります。 MyFirstViewModel、MySecondViewModel、MyThirdViewModelは、ある種類のMenuItemViewModelでマージすることはできません。これらの3つのビューモデルを使用したレイヤリングは私の問題です。階層型のdatatemplateについての答えは私のためには機能しません。wpf:ネストされたメニュー項目のバインド

私は3つのレベルがあることを知っているメニューを作りたいと思います。

  1. 第一レベルは第二レベルは私のビューモデルにのObservableCollection < MySecondViewModel>への結合から生成されるものの静的メニュー項目
  2. あります。
  3. MySecondViewModelではまた、私は私の第三のメニュー項目レベルにバインドするのObservableCollection < MyThirdViewModel>を持っています。私もまた、MyThirdViewModelのプロパティにバインドされたチェックボックスでテンプレートを使用する第3レベルで

。だから私のViewModelsはこのようになります:

public class MyFirstViewModel 
{ 
    public ObservableCollection<MySecondViewModel> MenuItemsSecondLevel { get; set; } 
    ... 
} 

public class MySecondViewModel 
{ 
    public string DisplayName{get; set;} 
    public ObservableCollection<MyThirdViewModel> MenuItemsThirdLevel{ get; set; } 
    ... 
} 

public class MyThirdViewModel 
{ 
    public string DisplayName{get; set;} 
    public bool IsChecked {get;set;} 
    ... 
} 

これに基づいて自分のWPFメニューを作成するにはどうすればよいですか?私がこれを試してみると:

<Menu> 
    <MenuItem Header="Select Source:" ItemsSource="{Binding MenuItemsSecondLevel}"> 
    <MenuItem Header="{Binding DisplayName}" ItemsSource="{Binding MenuItemsThirdLevel}" > 
    <MenuItem.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Content="{Binding DisplayName}" IsChecked="{Binding IsChecked}"/> 
     </DataTemplate> 
    </MenuItem.ItemTemplate> 
    </MenuItem> 
</MenuItem> 
</Menu> 

私のバインディングは機能しません。彼は、私はこのようなことが、より高度にする私のCollections.Ifのいずれかを見つけることができません。

<Menu> 
    <MenuItem Header="Select Source:" ItemsSource="{Binding MenuItemsSecondLevel}"> 
    <MenuItem.ItemTemplate> 
     <DataTemplate> 
     <MenuItem Header="{Binding DisplayName}" ItemsSource="{Binding MenuItemsThirdLevel}" > 
      <MenuItem.ItemTemplate> 
      <DataTemplate> 
       <CheckBox Content="{Binding DisplayName}" IsChecked="{Binding IsChecked}" /> 
      </DataTemplate> 
      </MenuItem.ItemTemplate> 
     </MenuItem> 
     </DataTemplate> 
    </MenuItem.ItemTemplate> 
    </MenuItem> 
</Menu> 

彼は、第二のレベルではなく、三分の一を見つけます。私のビューモデルの構造のように、メニューレベルを作成する最善の方法は何ですか?

メニュー項目を選択可能にすることができますが、ここではチェックボックスを使用する理由があります。

+0

'MenuItem'から派生した新しいクラスを作ることでカスタム' MenuItem'を作ってみましたか? – lightlike

+0

いいえ、私はあなたがそれが助けると思いますか?どのように私の問題を解決することができますか? – Nelly

+0

ああごめんなさい。私はあなたの問題を誤解したと思います。 ViewModelに 'INotifyPropertyChanged'を実装してみることができますか? UIが既に読み込んだ後で、 'ObservableCollection'を設定している可能性があります。 – lightlike

答えて

3

あなたはFirstViewModelがあなたのviewmodelの財産であると仮定すると、この

<Menu> 
    <MenuItem Header="Select Source:" 
       ItemsSource="{Binding FirstViewModel.MenuItemsSecondLevel}"> 
     <MenuItem.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type local:MySecondViewModel}" 
             ItemsSource="{Binding MenuItemsThirdLevel}"> 
       <TextBlock Text="{Binding DisplayName}" /> 
      </HierarchicalDataTemplate> 
      <DataTemplate DataType="{x:Type local:MyThirdViewModel}"> 
       <CheckBox Content="{Binding DisplayName}" /> 
      </DataTemplate> 
     </MenuItem.Resources> 
    </MenuItem> 
</Menu> 

を使用することができます。

+0

うわー!あなたは私の一日を作った!データ型でそれを解決するのはかなり良い考えです!それは動作します! – Nelly

+0

@Nellyようこそ。すべての平らなデータのための作品と私はかなり使いやすい:) –

関連する問題