c# - wpf:嵌套菜单项的绑定(bind)

标签 c# wpf

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

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

  1. 第一级是一个静态菜单项
  2. 第二层是通过绑定(bind)到 View 模型中的 ObservableCollection<MySecondViewModel> 生成的。
  3. MySecondViewModel中,我还有一个ObservableCollection<MyThirdViewModel>,我想将其绑定(bind)到我的第三个菜单项级别。

在第三级中,我还想使用带有复选框的模板,该模板也绑定(bind)到 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>

然后我的绑定(bind)不起作用。他找不到我的任何收藏。如果我像这样使它更高级:

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

他找到了第二层,但没有找到第三层。使菜单级别像我的 View 模型的结构一样的最佳方法是什么?

请注意,我知道您可以选择菜单项,但我们在此处使用复选框是有设计原因的。

最佳答案

你可以使用这个

<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 是您的 View 模型的属性。

关于c# - wpf:嵌套菜单项的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45956672/

相关文章:

c# - 从 web./app.config 更改动态 Web 引用

c# - 检查属性是否存在于自定义类列表中

c# - 如何在不降低质量的情况下调整图像大小

c# - Dispose 中的成员变量访问

c# - 在 MVVM 中的 View 和 View 模型之间共享对象

c# - 回调第二次不起作用

c# - 是什么决定了 WPF 中文本的修剪方式

c# - 在启用行虚拟化的情况下,如何停止在 WPF DataGrid 中滚动时调整列的大小?

c# - 如何检查 HttpWebRequest 上传的进度?

wpf - 指定 Name 或 x 时的开销 :Name attribute for WPF elements