C# WinRT、ISupportIncrementalLoading、组和自适应行为
我需要一些关于WinRT(UWP)、ISupportIncrementalLoading、ListView和自适应控件的帮助 我有一个带有属性“Items”的ViewModel,它是一个IncrementalLoadingCollection(一个从ObservableCollection继承并实现ISupportIncrementalLoading的类)。此集合通过调用Web服务来增加其项。集合中的项目数量很多,因此我希望我的ListView有一个虚拟化面板 webservice返回一个具有2个属性的Foo对象:C# WinRT、ISupportIncrementalLoading、组和自适应行为,c#,listview,windows-runtime,C#,Listview,Windows Runtime,我需要一些关于WinRT(UWP)、ISupportIncrementalLoading、ListView和自适应控件的帮助 我有一个带有属性“Items”的ViewModel,它是一个IncrementalLoadingCollection(一个从ObservableCollection继承并实现ISupportIncrementalLoading的类)。此集合通过调用Web服务来增加其项。集合中的项目数量很多,因此我希望我的ListView有一个虚拟化面板 webservice返回一个具有2
string GroupName { get; }
string Content { get; }
我需要具有以下行为的自适应ListView:
在电话模式下(如果全局宽度小于600),我希望每个项目都有一个宽度拉伸,并为电话指定一个特定的ItemTemplate(Template1):
在tablet/pc模式下(如果全局宽度大于600),我希望每个标题都有一个宽度拉伸,并使用tablet的特定ItemTemplate(Template2)逐行显示多个项目。每个项目的宽度和行中项目的数量取决于全局宽度。如果全局宽度介于600和800之间,我希望按行拉伸两个项目。如果全局宽度大于800,我希望按行拉伸3个项目:
为了解决自适应问题,主ListView将ItemsWrapGrid作为ItemsPanel。我在名为AdaptiveItemWidth的静态计算属性上绑定每个项的宽度。此属性的计算取决于应用程序的宽度。如果应用程序处于手机模式,则AdaptiveItemWidth等于设备宽度。在平板电脑模式下,它更复杂,但它要么是设备宽度的一半、三分之一或四分之一。
以下是装订:
Width="{Binding AdaptiveItemWidth, Source={StaticResource LayoutAdapter}}"
我尝试了一些解决方案,但没有一个是好的
第一种解决方案
我有另一个名为GroupedItems的属性,每次项目向自身添加项目时都会刷新该属性。GroupedItems的定义如下:
return this.Items.GroupBy(i => i.GroupName);
然后我使用一个CollectionView,其IsGrouped=true
此解决方案不起作用,因为分组集合禁用ItemsWrapGrid的虚拟化
第二种解决方案
my ViewModel的属性项是一个IncrementalLoadingCollection。GroupedFoo有两个属性:
字符串组名{get;}
ObservableCollection项{get;}
在每次调用LoadMoreItemsAsync时,我都创建GroupedFoo。如果集合中已经存在GroupName,我将在现有GroupedFoo中添加生成的GroupedFoo的所有项。例子:
如果我有:
现有项目:
{ GroupName: group1, Items: { Foo01, Foo02, Foo03 }}
{ GroupName: group2, Items: { Foo04, Foo05, Foo06 }}
{ GroupName: group1, Items: { Foo01, Foo02, Foo03 }}
{ GroupName: group2, Items: { Foo04, Foo05, Foo06, Foo07, Foo08, Foo09 }}
{ GroupName: group3, Items: { Foo10, Foo11, Foo12 }}
生成的项目:
{ GroupName: group2, Items: { Foo07, Foo08, Foo09 }}
{ GroupName: group3, Items: { Foo10, Foo11, Foo12 }}
我只回来
{GroupName:group3,项:{Foo10,Foo11,Foo12}
我将{Foo07,Foo08,Foo09}添加到GroupedFoo中GroupName为“group2”的现有项中。那么,我要这个:
现有项目:
{ GroupName: group1, Items: { Foo01, Foo02, Foo03 }}
{ GroupName: group2, Items: { Foo04, Foo05, Foo06 }}
{ GroupName: group1, Items: { Foo01, Foo02, Foo03 }}
{ GroupName: group2, Items: { Foo04, Foo05, Foo06, Foo07, Foo08, Foo09 }}
{ GroupName: group3, Items: { Foo10, Foo11, Foo12 }}
在XAML中,我有一个GroupedFoo模板,其中一个TextBlock用于GroupName属性,一个列表用于Items属性
这个解决方案有效,自适应也有效,但速度慢得令人难以置信
第三种解决方案
my ViewModel的属性项是一个IncrementalLoadingCollection。此集合可以有两种类型:
字符串表示标题,Foo表示项
然后,我在ListView上设置ItemTemplateSelector,根据这些类型为标题设置一个模板,为项目设置另一个模板
此解决方案比第二个更简单、更快,但它仅在电话模式下工作,并且仅在我将ItemsPanel更改为VirtualzingStackPanel时工作。在这个解决方案中,我不能有一个自适应行为
我尝试使用ItemsWrapGrid,但所有项目的大小都与电话模式下的标题相同。VariableSizedWrapGrid不能用作ListView的ItemsPanel,只能用于固定的项目大小
有什么想法吗