0

我有一个包含此 XAML 的用户控件

<UserControl x:Class="QA.JobListControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:QA" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400">

   <UserControl.Resources>
      <CollectionViewSource x:Name="itemsSource" IsSourceGrouped="True" />
   </UserControl.Resources>

   <ListView x:Name="JobListView" Margin="-10,-10,0,0" Padding="120,0,0,60" IsSwipeEnabled="False" ItemsSource="{Binding Source=itemsSource}" SelectionChanged="JobListView_SelectionChanged" SelectionMode="Single">
      <ListView.GroupStyle>
         <GroupStyle>
            <GroupStyle.HeaderTemplate>
               <DataTemplate>
                  <Border HorizontalAlignment="Stretch">
                     <TextBlock Text='{Binding Status}' Margin="10" />
                  </Border>
               </DataTemplate>
            </GroupStyle.HeaderTemplate>
         </GroupStyle>
      </ListView.GroupStyle>
      <ListView.ItemTemplate>
         <DataTemplate>
            <StackPanel Margin="10">
               <TextBlock Text='{Binding TaskName}' />
               <TextBlock Text='{Binding DueDate}' />
            </StackPanel>
         </DataTemplate>
      </ListView.ItemTemplate>
   </ListView>
</UserControl>

并设置我使用这个 C# 代码的内容

itemsSource.Source = Tasks.OrderBy(Tsk => Tsk.DueDate).GroupBy(Tsk => Tsk.Status);

它显示了一些元素(但它们显示为空元素),而不是全部显示
可能出了什么问题?

如果我使用这个 C#-code 它正在工作(但它没有分组)

JobListView.ItemsSource = Tasks.OrderBy(Tsk => Tsk.DueDate);

更新

添加StaticResource下面的内容后,它现在显示多个没有项目的组

ItemsSource="{Binding Source={StaticResource itemsSource}}"
4

1 回答 1

2

所以我认为你误解了 GroupBy 方法背后的基础知识。GroupBy,与大多数其他 Linq 扩展相反,不会返回简单的对象列表,而是返回 IGrouping 列表。IGrouping 接口公开了一个 Key 属性,该属性将保存您在 GroupBy lambda 中传递的分组鉴别器的值。

因此,要让列表显示组名,您必须将组头模板绑定到 Key 而不是 Status。

<TextBlock Text='{Binding Key}' Margin="10" />

此外,如果将您的 CollectionViewSource 作为资源引用,则需要定义一个资源键,以便稍后在 XAML 中将其作为静态资源引用。

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

并在列表视图中。

<ListView x:Name="JobListView" ItemsSource="{Binding Source={StaticResource groupedTasks}}">

这样我就可以让您的示例按预期工作。

作为补充阅读,我强烈建议您阅读Sergei Barskiy 的这篇文章,该文章演示了如何在 XAML 列表中使用分组,还提供了一个 GroupedData 类,在我看来,它比默认的 IGrouping 对象更好地公开数据并在其中使用它用户界面。

于 2012-12-27T18:20:29.457 回答