2013-03-01 7 views
5

私は、次のテンプレートを使用してWP8 LongListSelectorを持っている:あなたは複数の項目を選択するためにユーザを可能にする、各セルの項目の最後にチェックボックスがある見ることができるようにWP8 LongListSelectorがCheckBoxのChecked状態を間違って再利用するのはなぜですか?

<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属性をプロパティにバインドしようとしましたが、不運です。

これがバグかどうかは誰にも分かりますが、そうでない場合はどのように修正できますか?

ありがとうございます!

enter image description here

答えて

7

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

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

+0

おかげさまでした。私は前にこれを試したが、TwoWayは秘密だった! – esilver

+0

'TwoWay'がこの問題にどのように影響しますか? – Ku6opr

関連する問題