为什么WP8 LongListSelector错误地重用CheckBox的Checked状态?

esi*_*ver 5 silverlight checkbox longlistselector windows-phone-8

我有一个带有以下模板的WP8 LongListSelector:

    <DataTemplate x:Key="ItemTemplate">
        <Grid Margin="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="110"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <controls:BlockImageControl 
                        Grid.Column="0"
                        Width="110"
                        Height="110"
                        Background="Transparent" />
            <TextBlock x:Name="Name" 
                            Grid.Column="1"
                            Text="{Binding ScreenName}" 
                            FontSize="{StaticResource PhoneFontSizeLarge}"
                            FontWeight="Bold"
                            VerticalAlignment="Center"/>
            <CheckBox x:Name="Unblock" Grid.Column="2" VerticalAlignment="Center"
                      Tap="BlocksList_Tap"
                      IsChecked="false"
                      />
        </Grid>
    </DataTemplate>
Run Code Online (Sandbox Code Playgroud)

如您所见,每个单元格项的末尾都有一个复选框,使用户可以选择多个项目.默认情况下,IsChecked为false.

问题是LongListSelector似乎正在缓存我的复选框的Checked状态.如果我检查第一个项目,然后向下滚动,在大约30个左右的项目后,我看到另一个项目已选中,我没有选择.其余的绑定工作.就好像它忽略了模板中的"IsChecked"属性.我尝试将IsChecked属性绑定到属性,没有运气.

有谁知道这是一个错误,如果没有,我怎么能纠正这种行为?

谢谢!

在此输入图像描述

Den*_*nis 7

不是一个bug,虽然它起初可能看起来像一个bug.你看到的是ui虚拟化的影响,基本上LongListSelector回收数据模板而不是创建新的数据模板来提高性能.回收的一个已知副作用是,如果您的数据模板包含维护其自身状态的控件,例如CheckBox,该状态将转移到新项目.

要解决此问题,您需要在外部管理控制状态,即在视图模型中.在您的特定情况下,CheckBox的IsChecked属性必须绑定到视图模型的属性.并确保使用双向绑定.