MVVM Подменю WPF C#

Есть готовая версия кода, но там нет реализованного подменю, у меня не получается это реализовать, может найдётся кто сможет=)

Образец

Ссылка вопроса Ссылка проекта


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

Автор решения: aepot

Вы уверены, что нашли самый простой способ решения своей задачи?

Вроде-как TabControl это всё умеет.

<Grid>
    <TabControl>
        <TabItem Header="Tab1">
            <TabControl TabStripPlacement="Left">
                <TabItem Header="SubTab1"/>
                <TabItem Header="SubTab2"/>
                <TabItem Header="SubTab3"/>
            </TabControl>
        </TabItem>
        <TabItem Header="Tab2"/>
        <TabItem Header="Tab3"/>
    </TabControl>
</Grid>

Осталось только привязать табы к коллекциям, разметить шаблоны, добавить немного стилей для красоты, и готово.

tabcontrol

Дополнение

Чтобы растянуть горизонтальные табы на всю ширину TabControl, можно воспользоваться следующим способом, который я подглядел здесь, и немного доработал.

1) Создайте конвертер, добавьте в решение следующий класс

public class TabSizeConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values[0] is int itemsCount && itemsCount > 0 && values[1] is double actualWidth)
        {
            double width = actualWidth / itemsCount;
            return (width <= 1) ? 0 : (width - itemsCount); // минусую по пикселю за каждый таб, чтобы все влезло в одну строку
        }
        return null;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => null;
}

2) Затем добавьте конвертер в ресурсы окна

<Window.Resources>
    <local:TabSizeConverter x:Key="tabSizeConverter"/>
</Window.Resources>

3) Затем можно подключить этот конвертер к ширине табы, для того чтобы это аффектило только табконтрол с верхним расположением табов, я добавил Style.Trigger.

<TabControl>
    <TabControl.Resources>
        <Style TargetType="{x:Type TabItem}">
            <Style.Triggers>
                <Trigger Property="TabStripPlacement" Value="Top">
                    <Setter Property="Width">
                        <Setter.Value>
                            <MultiBinding Converter="{StaticResource tabSizeConverter}">
                                <Binding RelativeSource="{RelativeSource AncestorType={x:Type TabControl}}" Path="Items.Count"/>
                                <Binding RelativeSource="{RelativeSource AncestorType={x:Type TabControl}}" Path="ActualWidth" />
                            </MultiBinding>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </TabControl.Resources>
    <TabItem Header="Tab1">
        <TabControl TabStripPlacement="Left">
            <TabItem Header="SubTab1"/>
            <TabItem Header="SubTab2"/>
            <TabItem Header="SubTab3"/>
        </TabControl>
    </TabItem>
    <TabItem Header="Tab2"/>
    <TabItem Header="Tab3"/>
</TabControl>

tabcontrol stretched tabs

→ Ссылка