2017-08-30 333 views
2

請注意:此問題與WPF - How can I create menu and submenus using binding不同,因爲我想使用自己的視圖模型。 MyFirstViewModel,MySecondViewModel,MyThirdViewModel不能在一種MenuItemViewModel中合併,而使用這三種視圖模型的分層是我的問題,關於分層數據模板的答案對我不起作用。wpf:嵌套菜單項的綁定

我想做一個菜單,我知道我有3個關卡。

  1. 第一級是由在我的視圖模型的結合到的ObservableCollection < MySecondViewModel>生成的第二電平一個靜態菜單項
  2. MySecondViewModel我也有一個的ObservableCollection < MyThirdViewModel>我想結合我的第三個菜單項的水平。

在第三級我也想用一個模板,這也結合性質MyThirdViewModel的複選框。所以我的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

您可以使用此

<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> 

假設FirstViewModel是您的視圖模型的屬性。

+0

哇!你讓我今天一整天都感覺很好!用數據類型解決它是一個非常好的主意!這樣可行! – Nelly

+0

@Nelly您的歡迎。爲所有hirachical數據工作,我很容易使用:) –