[英]Items being reordered in LongListSelector
在我的WP8应用程序中,我使用LongListSelector来显示数据项。 分组工作,跳转列表工作。
我这里有通常的主/详细方案-单击列表中的项目,新页面显示了更多信息。
问题在于使用LongListSelector导航回到页面。 列表基本上是混乱的- 项目甚至在组之间都是随机重新排序的 。 单击项目可以正常工作ShowItemInfo
接收用户单击的项目的视图模型。
以前我使用的是ListBox,它也遭受了此问题的困扰。 但是我可以通过使用默认的StackPanel作为项目面板来禁用虚拟化。 我不知道如何在LongListSelector上禁用虚拟化(我不想这样做,但是该错误非常可怕)。
视图模型很简单。 我正在使用Caliburn.Micro,其约定和BindableCollection
作为组列表。 我仅使用AddRange
方法填充列表一次。
当页面导航回去时,我什么也没做-甚至因为我使用MVVM和Caliburn.Micro而无法执行。 这些项目将被加载到OnInitialize
回调的列表中,该回调在视图模型的生命周期内仅被调用一次。
用于查看的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
附加属性)时, LongListSelector
就像一个LongListSelector
一样工作。
我相信Caliburn.Micro中必须存在一个错误,这会导致此问题。
最初,我以为该错误是在1.5.2版本中使用的(不幸的是,我必须使用),并且该错误已在新的2.x版本中修复。
但是,事实并非如此,该错误仍在最新的稳定版本2.0.2中出现。
我在WPF中使用此技术没有任何问题。 我也尝试过在WP8.0和WP8.1的模拟器中运行该应用程序,但是行为是相同的。
如果有人发现了该错误的原因(或新版本的Caliburn.Micro修复了该错误),请随时编辑答案或发表评论。
我很乐意再次在数据模板中使用约定。
我的错误 :对于数据模板,应使用Bind.ModelWithoutContext
。 甚至文档也明确指出 :
Bind.ModelWithoutContext -View-First-将Action.Target设置为指定实例。 将约定应用于视图。 (在DataTemplate内部使用。)
使用Bind.ModelWithoutContext
LongListSelector可以正常工作(在项目模板中具有约定)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.