WinRT,ISupportIncrementalLoading,分组和适应性行为

时间:2015-12-30 10:40:45

标签: c# listview windows-runtime

我需要一些WinRT(UWP),ISupportIncrementalLoading,ListView和自适应控件的帮助!

我有一个带有属性“Items”的ViewModel,它是一个IncrementalLoadingCollection(一个继承自ObservableCollection并实现ISupportIncrementalLoading的类)。此集合通过调用Web服务来增加其项目。集合中的项目数量很高,所以我希望我的ListView有一个虚拟化面板。

webservice返回一个具有2个属性的Foo对象:

string GroupName { get; }
string Content { get; }

我想要一个具有此行为的自适应ListView:

在手机模式下(如果全局宽度低于600),我希望每个项目都有一个拉伸的宽度,具有特定的PhoneTemplate for phone(Template1): Phone

在平板电脑/电脑模式下(如果全局宽度高于600),我希望每个标题都有一个拉伸的宽度和多个逐行的平板电脑(Template2)的特定项目模板。每个项目的宽度和行数取决于全局宽度。如果全局宽度在600到800之间,我想要按行拉伸2个项目。如果全局宽度高于800,我想要按行拉伸3个项目: Tablet

要解决自适应问题,主ListView将ItemsWrapGrid作为ItemsPanel。我将每个项的宽度绑定在名为AdaptiveItemWidth的静态计算属性上。此属性的计算取决于应用程序的宽度。如果应用程序处于电话模式,则AdaptiveItemWidth等于设备宽度。在平板电脑模式下,它更复杂,但它是设备宽度的一半,三分之一或四分之一。 这是绑定:

Width="{Binding AdaptiveItemWidth, Source={StaticResource LayoutAdapter}}"

我尝试了一些解决方案,但没有一个是好的。

第一解决方案

我有另一个名为GroupedItems的属性,每次将项目添加到自身时都会刷新。 GroupedItems的定义如下:

return this.Items.GroupBy(i => i.GroupName);

然后我使用带有IsGrouped = true的CollectionView。

此解决方案不起作用,因为分组集合会禁用ItemsWrapGrid的虚拟化。

第二种解决方案

我的ViewModel的属性Items是IncrementalLoadingCollection。 GroupedFoo有2个属性: string GroupName {get; } ObservableCollection Items {get; }

每次调用LoadMoreItemsAsync时,我都会创建GroupedFoo。如果集合中已存在GroupName,则在现有GroupedFoo中添加生成的GroupedFoo的所有Items。例: 如果我有:

现有项目:

{ GroupName: group1, Items: { Foo01, Foo02, Foo03 }}
{ GroupName: group2, Items: { Foo04, Foo05, Foo06 }}

生成的项目:

{ GroupName: group2, Items: { Foo07, Foo08, Foo09 }}
{ GroupName: group3, Items: { Foo10, Foo11, Foo12 }}

我只回来 {GroupName:group3,Items:{Foo10,Foo11,Foo12}} 我将{Foo07,Foo08,Foo09}添加到GroupedFoo中具有GroupName“group2”的现有项目。所以,我会有这个:

现有项目:

{ GroupName: group1, Items: { Foo01, Foo02, Foo03 }}
{ GroupName: group2, Items: { Foo04, Foo05, Foo06, Foo07, Foo08, Foo09 }}
{ GroupName: group3, Items: { Foo10, Foo11, Foo12 }}

在XAML中,我有一个GroupedFoo模板,其中GroupName属性为TextBlock,Items属性为List。

这个解决方案有效,自适应也可以,但它的速度非常慢!

第3种解决方案

我的ViewModel的属性Items是IncrementalLoadingCollection。此集合可以有两种类型: string表示标题,Foo表示项目

然后我在ListView上设置ItemTemplateSelector,其中包含Header模板和另一个项目,具体取决于这些类型。

此解决方案比第二个解决方案更简单,更快,但它仅在手机模式下工作,并且只有在将ItemsPanel更改为VirtualizingStackPanel时才有效。在这个解决方案中,我不能有适应性行为。

我尝试使用ItemsWrapGrid,但所有项目都与手机模式下的标题大小相同。 VariableSizedWrapGrid不能用作带有ListView的ItemsPanel,只能用于固定项目大小。

有什么想法吗?

0 个答案:

没有答案