Вертикальное меню на XAML (wpf)

Всем привет! Пытаюсь реализовать стандартное вертикальное меню на XAML со следующей логикой:

  1. Есть несколько главных элементов меню, содержащих несколько подменю.
  2. Каждое из этих меню/подменю содержит command
  3. В один момент времени может быть активно только один из элементов
  4. Активное меню должно быть раскрыто, активное подменю должно быть визуально обозначено.
  5. При наведении мыши - главный элемент меню раскрывается и отображает подменю.
  6. Главный элемент меню сворачивается, если был выбран какой-либо другой элемент не относящийся к этому меню.
  7. Пункт со звездочкой - при клике на активный элемент не должно происходить сворачивание/визуальное изменение. Т.е. если в подменю есть выделенный элемент - у нас не должно быть возможности свернуть это меню, либо снять визуальное отображение.

Как я пытаюсь сделать это:

  1. Беру листбокс
  2. Помещаю в него экспанды (главный элемент меню)
  3. В эти экспанды помещаю еще один листбокс
  4. Накидываю чекбоксы (подменю)
  5. На IsExpanded вешаю
IsExpanded="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"
  1. Это позволяет оставлять только одно развернутое меню

    <ListBox x:Name="MyListBox">
                <ListBoxItem>
                    <Expander IsExpanded="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Header="First Expand">
                         <ListBox>
                            <ListBoxItem>
                                <CheckBox Content="First"/>
                            </ListBoxItem>
                            <ListBoxItem>
                                <CheckBox Content="Second"/>
                            </ListBoxItem>
                            <ListBoxItem>
                                <CheckBox Content="Third"/>
                            </ListBoxItem>
                        </ListBox>
                    </Expander>
                </ListBoxItem>
    
                <ListBoxItem>
                    <Expander IsExpanded="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Header="Second Expand">
                         <ListBox>
                            <ListBoxItem>
                                <CheckBox Content="First"/>
                            </ListBoxItem>
                            <ListBoxItem>
                                <CheckBox Content="Second"/>
                            </ListBoxItem>
                            <ListBoxItem>
                                <CheckBox Content="Third"/>
                            </ListBoxItem>
                        </ListBox>
                    </Expander>
                </ListBoxItem>
            </ListBox>
    

Все остальные вещи я не совсем представляю как сделать, буду очень рад если поможете разобраться со следующим:

  1. Что должно содержаться внутри экспанда, для корректного поведения? Чекбокс можно включать/отключать, а одна радиокнопка должна быть нажата всегда. Ну и попытки через биндинги реализовать "в один момент времени активных элементов должно быть <= 1" не очень срабатывают.
  2. Как прицепить к экспанду "IsMouseOver" на разворачивание? Пытался в шаблон повесить тригер, но это почему-то не сработало.
  3. Есть ли адекватный способ объяснить экспанду что он должен уметь Command? Или проще использовать что-то вместо экспанда?
  4. Ну и весь 7-й пункт в постановке задачи. Это в принципе решается биндингами? Или тут проще залезть в код-бехайнд?

Буду очень благодарен за любую помощь!

p.s. Делал через ListBoxItem, потому что не понял как менять шаблон для ListBox.Items (отключить выделение/отступы и т.д.). Проект на гит не заливал, если кто-то подскажет как скинуть архивом - скину.


Ответы (0 шт):