在我的WP8应用中,我使用LongListSelector来显示数据项。分组工作,跳转列表工作。
我有通常的主/详细方案 - 单击列表中的项目,新页面显示更多信息。
问题在于使用LongListSelector导航回页面。该列表基本搞砸了 - 项目随机重新排序,甚至在组之间。单击某个项目可以正常工作 - ShowItemInfo
接收用户点击的项目的视图模型。
以前我使用的是ListBox,它也遇到了这个问题。但我可以通过使用默认的StackPanel作为项目面板来禁用虚拟化。我不知道如何在LongListSelector上禁用虚拟化(我不想,但这个bug很可怕)。
查看模型很简单。我正在使用Caliburn.Micro,它的约定和BindableCollection
用于列表组。我只使用AddRange
方法填充列表一次。
当页面被导航回来时,我什么也没做 - 我甚至不能使用MVVM和Caliburn.Micro。这些项目被加载到OnInitialize
回调列表中,在视图模型的生命周期内,仅被调用一次。
XAML for view是这样的:
<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>
答案 0 :(得分:0)
我已将问题缩小到数据模板,更具体地说是附加属性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
就像一个魅力。
我相信Caliburn.Micro中必定存在一个错误,导致此问题。最初,我认为这个错误是在我使用的1.5.2版本中(不幸的是我必须使用),并且它已在新的2.x版本中修复。然而,事实并非如此,该错误仍然出现在最新的稳定版本2.0.2中。
我在WPF中使用这种技术没有任何问题。我也尝试在WP8.0和WP8.1的模拟器中运行应用程序,但行为是一样的。
如果有人发现,导致此错误的原因(或新版本的Caliburn.Micro修复它),请随时编辑回答或发表评论。我很乐意再次使用数据模板中的约定。
我的错误:对于数据模板,应使用Bind.ModelWithoutContext
。甚至文档explicitly says所以:
Bind.ModelWithoutContext - View-First - 将Action.Target设置为指定的实例。将约定应用于视图。 (在里面使用 DataTemplate。)
使用Bind.ModelWithoutContext
LongListSelector正常工作(使用项模板中的约定)。