繁体   English   中英

在LongListSelector中重新排序的项目

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM