我首先解释一下我想要实现的目标:
The Letter" A"是Listview中的一个ListViewHeaderItem。没有滚动,List的顶部看起来像这样。
在我滚动ListViewHeaderItem" A"与其他物品一起向下移动 - 但是我怎么能实现Header作为第一项的最佳状态,直到#34; B"与ist子项目即将到来?我想要实现的行为的一个例子是官方" Mail"适用于Windows 10的Microsoft应用程序。它将日期时间保持在最前面,直到一天前写完的电子邮件到来。
我不知道这个问题是否已经存在,但我不知道它是如何被调用的,我也不知道谷歌会做些什么。
答案 0 :(得分:3)
根据你的描述,我认为你想要的是一个分组的ListView。这里的关键点是使用CollectionViewSource作为ItemsSource
并设置GroupStyle来指定组的显示方式。以下是一个简单的示例:
在XAML中
<Page.Resources>
<CollectionViewSource x:Name="groupInfoCVS" IsSourceGrouped="True" />
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ListView ItemsSource="{Binding Source={StaticResource groupInfoCVS}}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Margin="15" Text="{Binding Path=Text}" />
</DataTemplate>
</ListView.ItemTemplate>
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<Grid Background="LightGray">
<TextBlock Margin="10" Foreground="Black" Text="{Binding Key}" />
</Grid>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListView.GroupStyle>
</ListView>
</Grid>
代码隐藏
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
List<TestDemo> list = new List<TestDemo>();
for (int i = 0; i < 6; i++)
{
list.Add(new TestDemo { Key = "A", Text = $"Test A {i}" });
list.Add(new TestDemo { Key = "B", Text = $"Test B {i}" });
}
var result = from t in list group t by t.Key;
groupInfoCVS.Source = result;
}
}
public class TestDemo
{
public string Key { get; set; }
public string Text { get; set; }
}
有关详细信息,请参阅GitHub上How to group items in a list or grid (XAML)中的ListView and GridView sample和简单列表视图示例。