wpf:嵌套菜单项的绑定

时间:2017-08-30 09:25:23

标签: c# wpf

请注意:此问题与WPF - How can I create menu and submenus using binding不同,因为我想使用自己的视图模型。 MyFirstViewModel,MySecondViewModel,MyThirdViewModel无法在一种MenuItemViewModel中合并,并且使用这3种视图模型的分层是我的问题,关于分层数据模板的答案对我不起作用。

我想制作一个菜单,我知道我有3个级别。

  1. 第一级是一个静态菜单项
  2. 第二级是通过绑定到我的视图模型中的 ObservableCollection< MySecondViewModel > 生成的。
  3. MySecondViewModel 中,我还有一个 ObservableCollection< MyThirdViewModel > ,我想将其绑定到第三个菜单项级别。
  4. 在第三级我还想使用一个带有Checkbox的模板,它也绑定到 MyThirdViewModel 中的属性。所以我的ViewModel看起来像这样:

    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>
    

    然后我的绑定无效。他找不到我的任何收藏品。如果我这样更先进:

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

    他找到了第二级但不是第三级。将菜单级别设置为我的视图模型的结构的最佳方法是什么?

    请注意,我知道您可以选择菜单项,但我们在这里使用复选框有一个设计理由。

1 个答案:

答案 0 :(得分: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是您的viewmodel的属性。