5

次のテンプレートを使用したWP8LongListSelectorがあります。

    <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がチェックボックスのチェック済み状態をキャッシュしているように見えることです。最初の項目をチェックしてから途中までスクロールすると、約30項目後に、選択しなかった別の項目がチェックされているのがわかります。残りのバインディングは機能します。これは、テンプレートの「IsChecked」プロパティを無視しているようです。IsChecked属性をプロパティにバインドしようとしましたが、うまくいきませんでした。

これがバグであるかどうかを誰かが知っていますか?そうでない場合は、どうすればこの動作を修正できますか?

ありがとう!

ここに画像の説明を入力してください

4

1 に答える 1

7

最初はバグのように見えるかもしれませんが、バグではありません。表示されるのは、UI仮想化の効果です。基本的に、LongListSelectorは、パフォーマンスを向上させるために新しいテンプレートを作成する代わりに、データテンプレートをリサイクルします。リサイクルの既知の副作用の1つは、データテンプレートに独自の状態を維持するコントロール(たとえば、CheckBox)が含まれている場合、その状態が新しいアイテムに引き継がれることです。

この問題を解決するには、制御状態を外部、つまりビューモデルで管理する必要があります。特定のケースでは、CheckBoxのIsCheckedプロパティをビューモデルのプロパティにバインドする必要があります。また、必ず双方向バインディングを使用してください。

于 2013-03-01T20:51:22.843 に答える