5

我正在使用 ObjectDataProvider 和 DataTemplate 在菜单栏中填充 MenuItem。(WPF、C#/XAML)见下面的片段。

结果:出现顶部菜单项,当我单击它时,包装菜单项(带有绑定标题文本的菜单项)与指示子项存在的小箭头一起出现,但悬停或单击箭头不显示子项,它们无法访问。

预期结果:孩子们是可见的并且行为正常。

片段:

<ObjectDataProvider x:Key="Brokers" ObjectInstance="{x:Static brokers:BrokerManager.Instance}" MethodName="GetBrokers" IsAsynchronous="True" />
        <DataTemplate x:Key="BrokerMenuItem" DataType="IBroker">
            <MenuItem Header="{Binding Path=Name}">
                <MenuItem Header="Connect" />
                <MenuItem Header="Disconnect" />
            </MenuItem>
        </DataTemplate>

<MenuItem Header="Brokers" ItemsSource="{Binding Source={StaticResource Brokers}}" ItemTemplate="{DynamicResource BrokerMenuItem}"/>
4

3 回答 3

1

arsenmrkt:我有完全相同的问题,如果我使用 DataTemplate 填充 MenuItem,我似乎无法将子项添加到任何这些生成的项目中。我不明白你的答案,我应该如何使用 ContentPresenter 来解决这个问题?

编辑:实际上,我的问题并不完全相同,因为我试图将集合集合绑定到菜单。我想我已经通过使用 HierarchicalDataTemplate 让它工作了:

<Menu>
    <MenuItem Header="{Binding Name}" ItemsSource="{Binding MenuOptions}">
        <MenuItem.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Categories}">
                <MenuItem Header="{Binding Name}"/>
                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <MenuItem Header="{Binding Name}"/>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </MenuItem.ItemTemplate>
    </MenuItem>
</Menu>

这对你 NicholasF 有帮助吗?

于 2009-06-03T10:19:12.110 回答
1

经过一个多星期的搜索,我终于找到了如何使其正常工作。事实证明,DataTemplates 对于动态菜单来说不太好用。正确的方法是使用 MenuItem 的 ItemContainerStyle 属性。(或者是 ItemStyleContainer?)

只需创建一个样式来覆盖标题并将其设置为您需要的任何内容。我他们覆盖了 ItemsSource 以包括我的孩子。但是在这里要小心,因为孩子将继承样式并且每个孩子都有相同的孩子并生成递归菜单。您需要覆盖您孩子的 ItemsSource 并将其设置为空 x:Array 或类似的。

有几个博客描述了如何使用 ItemContainerStyle,查看它们。

于 2009-06-21T16:45:52.760 回答
0

menuitem 控件的 ItemSource 属性用于为该项目提供子项,请尝试<ContentPresenter />与该数据模板一起使用。

于 2009-06-01T03:16:09.583 回答