Связанное меню WPF с использованием MVVM - найти ошибку - PullRequest
2 голосов
/ 18 июня 2011

Я пытаюсь реализовать Меню в Окне, используя шаблон MVVM. Поэтому я создал MainWindow и связал его с MainWindowViewModel. MainWindowViewModel содержит MainWindowMenuViewModel, которая является виртуальной машиной, специально разработанной для меню. Это иерархическая структура MenuItemViewModels. Все кажется простым, но у меня есть проблема - когда я запускаю приложение, меню не отображается должным образом - кажется, свойство Header не установлено. Меню находится в верхнем левом углу, но текст не отображается Я могу нажать на нее, и она открывается, но все элементы меню пустые. Что странно: связанные ICommands работают! Но заголовок не отображается. Вот мои ресурсы

<Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}" >
    <Style.Setters>
        <Setter Property="Header" Value="{Binding Path=Title}" />
        <Setter Property="Command" Value="{Binding Path=Command}" />
    </Style.Setters>
</Style>

<HierarchicalDataTemplate
    x:Key="MenuDataTemplate"
    DataType="{x:Type vw:MenuItemViewModel}"
    ItemsSource="{Binding Path=SubMenuItems}"
    ItemContainerStyle="{StaticResource ResourceKey=MenuItemStyle}"
    >
</HierarchicalDataTemplate>

MainWindow.xaml содержит меню:

<DockPanel>
    <Menu
        DockPanel.Dock="Top"
        ItemsSource="{Binding Path=Menu.MenuItems}"
        ItemTemplate="{StaticResource ResourceKey=MenuDataTemplate}"
        />
</DockPanel>

MenuItemView:

using System.Collections.Generic;
using System.Windows.Input;

namespace WpfMvvmMenu.ViewModel
{
    public class MenuItemViewModel
    {
        public MenuItemViewModel(string title, ICommand command)
        {
            this.Title = title;
            this.Command = command;
            this.SubMenuItems = new List<MenuItemViewModel>();
        }

        public string Title { get; private set; }
        public ICommand Command { get; private set; }
        public IList<MenuItemViewModel> SubMenuItems { get; private set; }
    }
}

Я видел все статьи о MVVM - меню, но все они говорят, что мой DataTemplate в порядке, поэтому должно быть что-то еще.

Спасибо.

1 Ответ

2 голосов
/ 19 июня 2011

Я думаю, что когда вы используете HierarchicalDataTemplate, вы устанавливаете Content шаблонного MenuItem на содержимое шаблона, даже если вы оставляете его пустым. Этот код работает:

<Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}">
    <Style.Setters>
        <Setter Property="Command" Value="{Binding Path=Command}" />
    </Style.Setters>
</Style>

<HierarchicalDataTemplate
    x:Key="MenuDataTemplate"
    DataType="{x:Type vw:MenuItemViewModel}"
    ItemsSource="{Binding Path=SubMenuItems}"
    ItemContainerStyle="{StaticResource MenuItemStyle}"
    >
    <ContentPresenter Content="{Binding Title}" />
</HierarchicalDataTemplate>

С другой стороны, вам вообще не нужен шаблон. Вы можете установить ItemContainerStyle="{StaticResource MenuItemStyle}" непосредственно в меню, используя следующий стиль:

<Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}">
    <Style.Setters>
        <Setter Property="Header" Value="{Binding Path=Title}" />
        <Setter Property="Command" Value="{Binding Path=Command}" />
        <Setter Property="ItemsSource" Value="{Binding SubMenuItems}" />
    </Style.Setters>
</Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...