UserControl CollectionViewSource not working
本文关键字:working not CollectionViewSource UserControl | 更新日期: 2023-09-27 17:49:36
我有一个包含这个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#代码,它正在工作(但它没有分组)
JobListView.ItemsSource = Tasks.OrderBy(Tsk => Tsk.DueDate);
像下面这样添加了StaticResource
之后,它现在显示了多个没有项的组
ItemsSource="{Binding Source={StaticResource itemsSource}}"
所以我认为您误解了GroupBy方法背后的基础知识。GroupBy与大多数其他Linq扩展不同,它不会返回一个简单的对象列表,而是返回一个IGrouping列表。igrouing接口公开了一个Key属性,该属性将保存您在GroupBy lambda中传递的分组标识符的值。
因此,要使列表显示组名,必须将组头模板绑定到Key而不是Status。
<TextBlock Text='{Binding Key}' Margin="10" />
同样,如果引用CollectionViewSource作为资源,您需要定义一个资源键,以便稍后在XAML中将其作为StaticResource引用。
<CollectionViewSource x:Name="itemsSource" x:Key="groupedTasks" IsSourceGrouped="True" />
在列表视图中。
<ListView x:Name="JobListView" ItemsSource="{Binding Source={StaticResource groupedTasks}}">
这样我让你的例子工作如预期。
作为额外阅读,我强烈建议您阅读Sergei Barskiy的这篇文章,它演示了如何在XAML列表中使用分组,并提供了一个GroupedData类,在我看来,它比默认的IGrouping对象更好,可以公开数据并在UI中使用它。