请注意:此问题与 WPF - How can I create menu and submenus using binding 不同因为我想使用我自己的 View 模型。 MyFirstViewModel、MySecondViewModel、MyThirdViewModel 无法合并在一种 MenuItemViewModel 中,这 3 个 View 模型的分层是我的问题,关于分层数据模板的答案对我不起作用。
我想制作一个菜单,其中我知道我有 3 个级别。
- 第一级是一个静态菜单项
- 第二层是通过绑定(bind)到 View 模型中的 ObservableCollection<MySecondViewModel> 生成的。
- 在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/