WPF MenuItem детей не показывает - PullRequest
4 голосов
/ 01 июня 2009

Я использую 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}"/>

Ответы [ 3 ]

1 голос
/ 03 июня 2009

arsenmrkt: У меня точно такая же проблема, если я заполняю MenuItem с помощью DataTemplate, я не могу добавить дочерние элементы к любому из этих сгенерированных элементов. Я не понимаю ваш ответ, как мне использовать ContentPresenter, чтобы обойти эту проблему?

EDIT: На самом деле, моя проблема была не совсем такой же, так как я пытаюсь привязать коллекцию коллекций к меню. Я думаю, что я получил его на работу, хотя с помощью 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?

0 голосов
/ 21 июня 2009

Пройдя поиск более недели, я наконец нашел, как сделать эту работу правильно. Оказывается, DataTemplates не слишком хорошо работают для динамических меню. Правильный способ сделать это - использовать свойство ItemContainerStyle объекта MenuItem. (Или это ItemStyleContainer?)

Просто создайте стиль, чтобы переопределить заголовок и установить его на то, что вам нужно. Я переопределил ItemsSource, чтобы включить моих детей. Однако будьте осторожны, так как дети наследуют стиль, и у каждого из них одни и те же дети, и генерируется рекурсивное меню. Вам нужно переопределить ItemsSource ваших детей и установить для него пустой x: Array или лайки.

Есть несколько блогов, описывающих, как использовать ItemContainerStyle, ознакомьтесь с ними.

0 голосов
/ 01 июня 2009

Свойство ItemSource элемента управления menuitem используется для задания детей для этого элемента, попробуйте использовать <ContentPresenter /> с этой табличкой данных.

...