Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Контекстное меню


Автор: zhiday 17.1.2012, 11:02
Даже и не знаю как толком сформулировать))
В общем необходимо написать контекстное меню с n-ным уровнем вложенности.

Делаю класс, представляющий айтим:

Код

public class MenuItem
    {
        public MenuItem()
        {
            Items = new List<MenuItem>();
        }

        public string Title { get; set; }
        public List<MenuItem> Items { get; set; }
        public ICommand Command { get; set; }
        public Image Image { get; set; }
    }


Где-то создаю коллекцию этих айтимов:

Код

public List<MenuItem> Menu
        {
            get
            {
                var avids = new List<int>();
                foreach (var command in Commands)
                {
                    var id = command.GroupID;
                    if (!avids.Contains(id))
                    {
                        avids.Add(id);
                    }
                }

                if (avids.Count == 0) return null;

                var mainMenu = new List<MenuItem>();

                foreach (var id in avids)
                {
                    var items = (from command in Commands
                                 where command.GroupID == id
                                 select new MenuItem
                                            {
                                                Title = command.Title, 
                                                Command = command, 
                                                Image = command.Image
                                            }).ToList();

                    var subMenu = new MenuItem
                                      {
                                          Items = items, 
                                          Command = items.First().Command, 
                                          Image = items.First().Image, 
                                          Title = items.First().Title
                                      };

                    mainMenu.Add(subMenu);
                }

                return mainMenu;
            }
        }


И устанавливаю ContextMenu.DataContext = Menu;

ContextMenu следующее:

Код

<ContextMenu x:Name="ContextMenu">
                    <ContextMenu.ItemContainerStyle>
                        <Style TargetType="{x:Type MenuItem}">
                            <Setter Property="MenuItem.Header" Value="{Binding Title}"/>
                            <Setter Property="MenuItem.ItemsSource" Value="{Binding Items}"/>
                            <Setter Property="MenuItem.Command" Value="{Binding Command}"/>
                            <Setter Property="CommandParameter" Value="{Binding Title}"/>
                        </Style>
                    </ContextMenu.ItemContainerStyle>
                </ContextMenu> 


То есть каждому Item'у независимо от уровня вложенности соответствует какая-то команда.
Но выполняются только команды Item'ов на самом вложенном уровне... Клик на Item'е верхнего уровня только раскрывает список детей. 
Что бы такого сделать чтобы клик по любому Item'у приводил к выполнению связанной с ним команды?
Вроде бы как хитрый какой-то Template надо написать... Но никак не пойму как)

Заранее спасибо за ответы)

Автор: zhiday 18.1.2012, 15:45
В общем сделал меню из вложенных Popup'ов. Но всё равно не покидает мысль, что можно сделать проще с использованием ContextMenu.
Если кто-нибудь поделиться опытом -- буду очень благодарен =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)