Listbox: listboxitem с группой и без группы listboxitem - PullRequest
1 голос
/ 01 октября 2019

Поэтому я использую поле списка в качестве боковой навигационной панели

Я пытаюсь отсортировать список из этого

  • Элемент списка 1 (Домой)
  • Элемент списка2 (Выйти)
  • Группа с расширителем (Бухгалтерия) со списком элементов потомков (Продажи, Продукт)

по этому:

  • Список элементов 1 (Главная)
  • Группа с экспандером (бухгалтерия) с дочерними списками элементов (продажи, продукт)
  • список 2 элементов (выход из системы)

, но я не могу отсортировать 3элементы на основе их индекса в элементе источника.

По сути, это список, который я пытаюсь достичь

Вот как я добавил элементы в свой список

public ObservableCollection<ContentObject> ContentItems { get; set; } = new ObservableCollection<ContentObject>();
public MainWindowViewModel()
    {
        ChangeToggleStateCommand = new RelayCommand(action => { IsMenuToggleEnabled = false;});

        ContentItems.Add(new ContentObject("Home", new HomeView(), MaterialDesignThemes.Wpf.PackIconKind.Home,"None"));
        ContentItems.Add(new ContentObject("Sales", new SalesView(), MaterialDesignThemes.Wpf.PackIconKind.CashMultiple, "Accounting"));
        ContentItems.Add(new ContentObject("Product", new ProductsView(), MaterialDesignThemes.Wpf.PackIconKind.CubeOutline, "Accounting"));
        ContentItems.Add(new ContentObject("Log out", new SalesView(), MaterialDesignThemes.Wpf.PackIconKind.Logout, "None"));
    }

Поле со списком XAML CODE

<ListBox x:Name="ContentList" Margin="0 16 0 16" SelectedIndex="0" ItemsSource="{Binding Source={StaticResource ListBoxItems}}" >
                        <ListBox.GroupStyle>
                            <GroupStyle>
                                <GroupStyle.ContainerStyle>
                                    <Style TargetType="{x:Type GroupItem}">
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate>
                                                    <Expander IsExpanded="False">
                                                        <Expander.Header>
                                                            <StackPanel Orientation="Horizontal">
                                                                <TextBlock FontSize="15" Text="{Binding Name}"  Margin="15 15" />
                                                            </StackPanel>
                                                        </Expander.Header>
                                                        <ItemsPresenter />
                                                    </Expander>
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding Name}" Value="None">
                                                <Setter Property="Template">
                                                    <Setter.Value>
                                                        <ControlTemplate TargetType="{x:Type GroupItem}">
                                                            <StackPanel>
                                                                <ItemsPresenter/>
                                                            </StackPanel>
                                                        </ControlTemplate>
                                                    </Setter.Value>
                                                </Setter>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </GroupStyle.ContainerStyle>
                            </GroupStyle>
                        </ListBox.GroupStyle>
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Border BorderThickness="0">
                                    <Grid>
                                        <StackPanel Orientation="Horizontal">
                                            <materialDesign:PackIcon Kind="{Binding Icon}" Height="15" Width="15" Margin="15 15" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                            <TextBlock FontSize="15" Text="{Binding Title}"  HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                        </StackPanel>
                                    </Grid>
                                </Border>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="MouseLeftButtonUp">
                                <i:InvokeCommandAction Command="{Binding ChangeToggleStateCommand}"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </ListBox>

Вот как я сгруппировал свои ContentItems

<Window.Resources>
    <CollectionViewSource x:Key="ListBoxItems" Source="{Binding Path=ContentItems,UpdateSourceTrigger=PropertyChanged}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="Category"/>
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
</Window.Resources>

На основе того, как я его реализовал. шаблон по умолчанию помечен как category: None. Wpf предполагает, что ни одна из них не является группой, содержащей Home и Logout, таким образом обрабатывая его как группу без заголовка. Вот почему я не могу разделить два списка. Есть ли другой способ отделить это или реализовать это?

Я нашел похожий вопрос, но сортировка не была решена

Группировка списков WPF, элементы без групп

Проверьте код здесь: https://github.com/asdtgb/NavigatorTest

...