2013-03-01 14 views
5

Ho un LongListSelector WP8 con la seguente configurazione:Perché WP8 LongListSelector riutilizza in modo errato lo stato controllato di CheckBox?

<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> 

Come potete vedere c'è una casella di controllo al termine di ogni elemento delle cellule, che permette all'utente di selezionare più elementi. IsChecked è falso per impostazione predefinita.

Il problema è che LongListSelector sembra memorizzare nella cache la casella di controllo dello stato selezionato. Se controllo il primissimo articolo, poi scorro verso il basso, dopo circa 30 elementi, vedo un altro oggetto controllato che non ho selezionato. Il resto degli attacchi funziona. È come se ignorasse la proprietà "IsChecked" nel modello. Ho provato a legare l'attributo IsChecked a una proprietà, senza fortuna.

Qualcuno sa se questo è un bug, e se no, come posso correggere questo comportamento?

Grazie!

enter image description here

risposta

7

Non un errore, anche se potrebbe apparire come un insetto in un primo momento. Quello che vedi è l'effetto della virtualizzazione dell'interfaccia utente, in pratica LongListSelector ricicla i modelli di dati invece di crearne di nuovi per migliorare le prestazioni. Un noto effetto collaterale del riciclaggio è che se il modello di dati contiene controlli che mantengono il proprio stato, CheckBox per esempio, tale stato verrà trasferito al nuovo elemento.

Per risolvere questo problema è necessario gestire lo stato del controllo esternamente, ovvero nel modello di visualizzazione. Nel tuo caso specifico, la proprietà IsChecked di CheckBox deve essere associata a una proprietà del modello di visualizzazione. E assicurati di usare il binding in due modi.

+0

Grazie mille. Avevo provato prima ma il TwoWay era il segreto! – esilver

+0

In che modo 'TwoWay' influisce su questo problema? – Ku6opr

Problemi correlati