在 LongListSelector 中重新排序的项目
Items being reordered in LongListSelector
在我的 WP8 应用程序中,我使用 LongListSelector 来显示数据项。分组有效,跳转列表有效。
我这里有通常的 master/detail 场景 - 单击列表中的项目,新页面显示更多信息。
问题在于使用 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
就像一个魅力。
我相信 Caliburn.Micro 中一定有错误导致了这个问题。最初,我认为该错误出现在我正在使用的 1.5.2 版本中(不幸的是我不得不这样做),并且它已在新的 2.x 版本中得到修复。然而,事实并非如此,该错误仍然出现在最新的稳定版本 2.0.2.
我在 WPF 中使用这种技术没有任何问题。我也在 WP8.0 和 WP8.1 的模拟器中尝试了 运行 应用程序,但行为是一样的。
如果有人发现导致此错误的原因(或 Caliburn.Micro 的新版本修复了它),请随时编辑答案或 post 发表评论。我很乐意再次在数据模板中使用约定。
我的错误:对于数据模板,应该使用Bind.ModelWithoutContext
。甚至文档 explicitly says 所以:
Bind.ModelWithoutContext - View-First - Set’s the Action.Target to the specified instance. Applies conventions to the view. (Use inside
of DataTemplate.)
使用 Bind.ModelWithoutContext
LongListSelector 可以正常工作(在项目模板中有约定)。
在我的 WP8 应用程序中,我使用 LongListSelector 来显示数据项。分组有效,跳转列表有效。
我这里有通常的 master/detail 场景 - 单击列表中的项目,新页面显示更多信息。
问题在于使用 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
就像一个魅力。
我相信 Caliburn.Micro 中一定有错误导致了这个问题。最初,我认为该错误出现在我正在使用的 1.5.2 版本中(不幸的是我不得不这样做),并且它已在新的 2.x 版本中得到修复。然而,事实并非如此,该错误仍然出现在最新的稳定版本 2.0.2.
我在 WPF 中使用这种技术没有任何问题。我也在 WP8.0 和 WP8.1 的模拟器中尝试了 运行 应用程序,但行为是一样的。
如果有人发现导致此错误的原因(或 Caliburn.Micro 的新版本修复了它),请随时编辑答案或 post 发表评论。我很乐意再次在数据模板中使用约定。
我的错误:对于数据模板,应该使用Bind.ModelWithoutContext
。甚至文档 explicitly says 所以:
Bind.ModelWithoutContext - View-First - Set’s the Action.Target to the specified instance. Applies conventions to the view. (Use inside of DataTemplate.)
使用 Bind.ModelWithoutContext
LongListSelector 可以正常工作(在项目模板中有约定)。