5

我有一个带有以下模板的 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>

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

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

有谁知道这是否是一个错误,如果不是,我该如何纠正这种行为?

谢谢!

在此处输入图像描述

4

1 回答 1

7

不是一个错误,虽然它一开始可能看起来像一个错误。你看到的是ui虚拟化的效果,基本上LongListSelector回收数据模板而不是创建新的模板来提高性能。回收的一个已知副作用是,如果您的数据模板包含保持自己状态的控件,例如 CheckBox,则该状态将延续到新项目。

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

于 2013-03-01T20:51:22.843 回答