【问题标题】:How to to grouping and sorting at the same time for a list box in xaml?如何同时对xaml中的列表框进行分组和排序?
【发布时间】:2017-05-29 11:21:11
【问题描述】:

我想同时对我的列表框项目源进行排序和分组。 我需要这样的东西Grouping and Sorting

我现在正在尝试这个:

<CollectionViewSource x:Key="cvs" x:Name="cvs" IsSourceGrouped="True"> </CollectionViewSource>

<ListBox Background="#282828" x:Name="sendersearchresults" ItemsSource="{Binding Source={StaticResource cvs}}">
                            <ListBox.GroupStyle>
                                <GroupStyle>
                                    <GroupStyle.HeaderTemplate>
                                        <DataTemplate>
                                            <StackPanel Margin="20,0,0,0">
                                                <TextBlock Foreground="#FFCF06" FontSize="40" FontWeight="Normal" Text="{Binding FirstName,Converter={StaticResource PrefixValueConverter},ConverterParameter=1}" />
                                                <Button Background="Transparent" Margin="-100,0,0,0" BorderThickness="0" BorderBrush="Transparent" Width="400">
                                                    <Grid>
                                                        <Grid.RowDefinitions>
                                                            <RowDefinition/>
                                                            <RowDefinition/>
                                                        </Grid.RowDefinitions>
                                                        <Image Source="{Binding Icon}" Grid.Row="0" Width="50" Height="50" HorizontalAlignment="Left" Margin="-12,4,0,0"/>
                                                        <TextBlock FontWeight="Medium" Text="{Binding MiddleName}" Margin="40,0,0,0" HorizontalAlignment="Left" Grid.Row="0" FontSize="20" Foreground="White"/>
                                                        <Grid Grid.Row="1">
                                                            <Grid.ColumnDefinitions>
                                                                <ColumnDefinition/>
                                                                <ColumnDefinition/>
                                                            </Grid.ColumnDefinitions>
                                                            <TextBlock FontWeight="Medium" Text="{Binding FirstName}" TextAlignment="Left" Margin="40,-22,0,0" Grid.Column="0" FontSize="20" Foreground="Gray"/>
                                                            <TextBlock FontWeight="Medium" HorizontalAlignment="Right" Grid.Column="0" Text="," FontSize="20" Margin="0,-22,-3,0" Foreground="Gray"/>
                                                            <TextBlock FontWeight="Medium" Text="{Binding LastName}" TextAlignment="Right" Grid.Column="1" Margin="6,-22,0,0" FontSize="20" Foreground="Gray"/>
                                                        </Grid>
                                                    </Grid>
                                                    <Button.Flyout>
                                                        <MenuFlyout Placement="Right">
                                                            <MenuFlyoutItem Text="Open" Click="MenuFlyoutItem_Click"/>
                                                            <MenuFlyoutItem Text="Edit" x:Name="editsenderclick" Click="editsenderclick_Click"/>
                                                        </MenuFlyout>
                                                    </Button.Flyout>
                                                </Button>
                                            </StackPanel>

                                        </DataTemplate>
                                    </GroupStyle.HeaderTemplate>
                                </GroupStyle>
                            </ListBox.GroupStyle>
                        </ListBox>

和c#:

listSearchResults.GroupBy(x => x.FirstName[0]).ToList(); listSearchResults.Sort((x,y)=> string.Compare(x.FirstName,y.FirstName)); cvs.Source = listSearchResults;

我得到了这个 result

提前致谢。

【问题讨论】:

    标签: sorting xaml listbox uwp grouping


    【解决方案1】:

    至少,我可以建议您将集合分组为以下代码:

    cvs.Source = peopleCollection.OrderBy(x => x.FirstName).GroupBy(x => x.FirstName[0]).ToList();
    

    之后您检索对象List&lt;IGrouping&lt;char, Person&gt;&gt; 类型。

    您在定义ListBox.GroupStyle 时的错误。您必须在此部分中仅定义标题表示,并为您的集合内部部分定义ItemTemplate。所以你需要这样的单独代码:

        <ListBox Background="#282828" x:Name="sendersearchresults" ItemsSource="{Binding Source={StaticResource cvs}}">
            <ListBox.GroupStyle>
                <GroupStyle>
                    <GroupStyle.HeaderTemplate>
                        <DataTemplate>
                            <StackPanel Margin="20,0,0,0">
                                <TextBlock Foreground="#FFCF06"
                                           FontSize="40"
                                           FontWeight="Normal" 
                                           Text="{Binding Key}" />
                            </StackPanel>
                        </DataTemplate>
                    </GroupStyle.HeaderTemplate>
                </GroupStyle>
            </ListBox.GroupStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Button Background="Transparent" Margin="-100,0,0,0" BorderThickness="0" BorderBrush="Transparent" Width="400">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>
                            <Image Source="{Binding Icon}" Grid.Row="0" Width="50" Height="50" HorizontalAlignment="Left" Margin="-12,4,0,0"/>
                            <TextBlock FontWeight="Medium" Text="{Binding MiddleName}" Margin="40,0,0,0" HorizontalAlignment="Left" Grid.Row="0" FontSize="20" Foreground="White"/>
                            <Grid Grid.Row="1">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition/>
                                    <ColumnDefinition/>
                                </Grid.ColumnDefinitions>
                                <TextBlock FontWeight="Medium" Text="{Binding FirstName}" TextAlignment="Left" Margin="40,-22,0,0" Grid.Column="0" FontSize="20" Foreground="Gray"/>
                                <TextBlock FontWeight="Medium" HorizontalAlignment="Right" Grid.Column="0" Text="," FontSize="20" Margin="0,-22,-3,0" Foreground="Gray"/>
                                <TextBlock FontWeight="Medium" Text="{Binding LastName}" TextAlignment="Right" Grid.Column="1" Margin="6,-22,0,0" FontSize="20" Foreground="Gray"/>
                            </Grid>
                        </Grid>
                        <Button.Flyout>
                            <MenuFlyout Placement="Right">
                                <MenuFlyoutItem Text="Open" Click="MenuFlyoutItem_Click"/>
                                <MenuFlyoutItem Text="Edit" x:Name="editsenderclick" Click="editsenderclick_Click"/>
                            </MenuFlyout>
                        </Button.Flyout>
                    </Button>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    

    查看最终结果(没有 Icon 和 MiddleName)

    【讨论】:

    • 像魅力一样工作。非常感谢老兄。
    • 知道为什么我的图片没有对齐吗?
    猜你喜欢
    • 2020-12-29
    • 1970-01-01
    • 2019-12-26
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2015-07-30
    相关资源
    最近更新 更多