每个绑定项的子菜单

本文关键字:菜单 绑定 | 更新日期: 2023-09-27 18:12:30

按照Omer van Kloeten的例子,我用从我的可观察集合绑定的菜单项填充了一个菜单。我得到了一个单独的菜单项为一个收集项目。很好,但实际上我想要更多。我还希望能够为一个集合项目提供一个包含两个或三个子项目的菜单项。以下是一些粗略的草图:

What I Have         What I Want
+ First Item        + Create First Item
+ Second Item       + Second Item
                      + Delete
                      + Update

这里"第一项"具有属性Exists = false,但"第二项"具有其属性true。我当前的代码:

public class CollectionItem
{
    public string Name { get; set; }
    public bool Exists { get; set; }
}
public partial class MainWindow : Window
{
    ObservableCollection<CollectionItem> items;
    public MainWindow()
    {
        items = new ObservableCollection<CollectionItem>();
        items.Add(new CollectionItem() { Name = "First Item", Exists = false });
        items.Add(new CollectionItem() { Name = "Second Item", Exists = true });
        AllItems.ItemsSource = items;
    }
}
<MenuItem x:Name="AllItems" Header="What I Have">
    <MenuItem.ItemContainerStyle>
        <Style TargetType="{x:Type MenuItem}">
            <Setter Property="Header" Value="{Binding Path=Name}" />
        </Style>
    </MenuItem.ItemContainerStyle>
</MenuItem>

如何将简单菜单项与子项混合?

每个绑定项的子菜单

如何将简单菜单项与子项混合?

首先,您需要对数据进行适当的结构化,使用集合属性来表示子MenuItem s。然后,您需要使用MenuItem.ItemContainerStyle将集合属性数据绑定到父MenuItemItemsSource属性,类似于您现在所做的操作。你最终应该得到这样的东西:

public class CollectionItem
{
    public string Name { get; set; }
    public bool Exists { get; set; }
    public ObservableCollection<CollectionItem> CollectionOfSubItems { get; set; }
}

<MenuItem x:Name="AllItems" Header="What I Have">
    <MenuItem.ItemContainerStyle>
        <Style TargetType="{x:Type MenuItem}">
            <Setter Property="Header" Value="{Binding Path=Name}" />
            <Setter Property="ItemsSource" Value="{Binding CollectionOfSubItems}" />
        </Style>
    </MenuItem.ItemContainerStyle>
</MenuItem>