代码之家  ›  专栏  ›  技术社区  ›  Matěj Zábský

将菜单项绑定到递归数据结构

  •  0
  • Matěj Zábský  · 技术社区  · 15 年前

    class MenuData{
        public string Header {get; protected set;}
        public ObservableCollection<MenuData> Items { get; protected set; }
    }
    
    ObservableCollection<MenuData> Menus {get; protected set;}
    

    我想将Menus属性绑定为Menu元素ItemsSource。结果应该看起来像标准的Windows菜单栏:第一级的项目将与隐藏的子项目水平排列为子菜单。

    我尝试使用XAML创建第一个级别(水平菜单栏):

    <my:MenuElement ItemsSource="{Binding Menus}">
        <my:MenuElement.ItemTemplate>
            <DataTemplate>                
                <MenuItem Header="{Binding Header}">                    
                    <!-- Try to add some sub-menus to see what it is going to look like. -->
                    <MenuItem Header="A" />
                    <MenuItem Header="A" />
                    <MenuItem Header="A" />
                    <MenuItem Header="A" />
                </MenuItem>
            </DataTemplate>
        </my:MenuElement.ItemTemplate>
    </my:MenuElement>
    

    class MenuElement: System.Windows.Controls.Menu 
    {
        protected override DependencyObject GetContainerForItemOverride()
        {
            return new System.Windows.Controls.ContentPresenter();
        }
    }
    

    但是结果看起来完全错误(注意高亮显示太大和子菜单箭头)

    alt text

    谢谢你的帮助。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Matěj Zábský    15 年前

    所以我终于明白了。答案是 HierarchicalDataTemplate .