Windows phone 8 正在LongListSelector中重新排序的项
在我的WP8应用程序中,我使用LongListSelector来显示数据项。分组有效,跳转列表有效 我这里有通常的主/细节场景-单击列表中的项目,新页面将显示更多信息 问题在于使用LongListSelector导航回页面。列表基本上是一团糟的——项目被随机重新排序,甚至在组之间。单击某个项目可以正常工作-Windows phone 8 正在LongListSelector中重新排序的项,windows-phone-8,mvvm,longlistselector,ui-virtualization,Windows Phone 8,Mvvm,Longlistselector,Ui Virtualization,在我的WP8应用程序中,我使用LongListSelector来显示数据项。分组有效,跳转列表有效 我这里有通常的主/细节场景-单击列表中的项目,新页面将显示更多信息 问题在于使用LongListSelector导航回页面。列表基本上是一团糟的——项目被随机重新排序,甚至在组之间。单击某个项目可以正常工作-ShowItemInfo接收用户单击的项目的视图模型 以前我使用的是ListBox,它也受到这个问题的影响。但我可以使用默认的StackPanel作为items面板来禁用虚拟化。我不知道如何在
ShowItemInfo
接收用户单击的项目的视图模型
以前我使用的是ListBox,它也受到这个问题的影响。但我可以使用默认的StackPanel作为items面板来禁用虚拟化。我不知道如何在LongListSelector上禁用虚拟化(我不想禁用,但这个bug很可怕)
视图模型很简单。我使用Caliburn.Micro及其约定和BindableCollection
作为组列表。我只使用AddRange
方法填充列表一次
当页面被导航回的时候,我什么也没做——我甚至做不到,因为我使用了MVVM和Caliburn.Micro。这些项被加载到OnInitialize
callback中的列表中,在视图模型的生命周期中只调用一次
视图的XAML如下所示:
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.Resources>
<phone:JumpListItemBackgroundConverter x:Key="BackgroundConverter"/>
<phone:JumpListItemForegroundConverter x:Key="ForegroundConverter"/>
<Style x:Key="ListJumpListStyle" TargetType="phone:LongListSelector">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Border Background="{Binding Converter={StaticResource BackgroundConverter}}"
HorizontalAlignment="Stretch">
<TextBlock Text="{Binding GroupTitle}"
Foreground="{Binding Converter={StaticResource ForegroundConverter}}" />
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<phone:LongListSelector x:Name="Items" LayoutMode="List" IsGroupingEnabled="True"
JumpListStyle="{StaticResource ListJumpListStyle}">
<phone:LongListSelector.ItemTemplate>
<DataTemplate>
<Grid cal:Bind.Model="{Binding}"
cal:Message.Attach="[Event Tap] = [ShowItemInfo($dataContext)]"
Background="Transparent">
<TextBlock x:Name="ItemText" Style="{StaticResource PhoneTextTitle2Style}" />
</Grid>
</DataTemplate>
</phone:LongListSelector.ItemTemplate>
<phone:LongListSelector.GroupHeaderTemplate>
<DataTemplate>
<Border>
<TextBlock Text="{Binding GroupTitle}" />
</Border>
</DataTemplate>
</phone:LongListSelector.GroupHeaderTemplate>
</phone:LongListSelector>
</Grid>
我已将问题缩小到数据模板,更具体地说是附加属性
Bind.Model
,它允许Caliburn.Micro将视图模型绑定到视图:
<DataTemplate>
<Grid cal:Bind.Model="{Binding}"
cal:Message.Attach="[Event Tap] = [ShowItemInfo($dataContext)]"
Background="Transparent">
<TextBlock x:Name="ItemText" Style="{StaticResource PhoneTextTitle2Style}" />
</Grid>
</DataTemplate>
当此视图更改为使用显式绑定而不是约定时(并且删除了Bind.Model
attached属性),LongListSelector
的工作方式很有魅力
我相信Caliburn.Micro中一定有一个bug,这导致了这个问题。起初,我认为这个bug出现在我正在使用的1.5.2版本中(不幸的是,我不得不这么做),并且它在新的2.x版本中得到了修复。然而,事实并非如此,该缺陷仍在最新的稳定版本2.0.2中出现
我在WPF中使用此技术时没有遇到任何问题。我还尝试在WP8.0和WP8.1的模拟器中运行该应用程序,但行为是相同的
如果有人发现了,是什么导致了这个错误(或者Caliburn.Micro的新版本修复了它),请随意编辑答案或发表评论。我很乐意再次在数据模板中使用约定
我的错误:对于数据模板,应使用Bind.ModelWithoutContext
。即使如此:
Bind.ModelWithoutContext-首先查看-将Action.Target设置为指定实例。将约定应用于视图。(在内部使用)
数据模板的名称。)
使用Bind.ModelWithoutContext
LongListSelector可以正常工作(使用项模板中的约定)