2013-03-01 8 views
5

Ich habe einen WP8 LongListSelector mit der folgenden Vorlage:Warum verwendet WP8 LongListSelector den Checked-Status von CheckBox falsch?

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

Wie Sie eine Checkbox gibt es am Ende jeder Zelle Artikel zu sehen, die es dem Benutzer mehrere Elemente auswählen können. IsChecked ist standardmäßig falsch.

Das Problem ist, dass der LongListSelector den Checked-Status meines Kontrollkästchens zwischenzuspeichern scheint. Wenn ich den allerersten Artikel überprüfe, dann scrolle nach unten, nach etwa 30 Artikeln sehe ich einen anderen Artikel, den ich nicht ausgewählt habe. Der Rest der Bindungen funktioniert. Es ist so, als würde die Eigenschaft "IsChecked" in der Vorlage ignoriert. Ich habe versucht, das IsChecked-Attribut an eine Eigenschaft zu binden, kein Glück.

Weiß jemand, ob dies ein Fehler ist, und wenn nicht, wie kann ich dieses Verhalten korrigieren?

Danke!

enter image description here

Antwort

7

keinen Fehler, obwohl es zunächst wie ein Bug aussehen könnte. Was Sie sehen, ist der Effekt der ui-Virtualisierung. Im Grunde recycelt LongListSelector Datenvorlagen, anstatt neue zu erstellen, um die Leistung zu verbessern. Ein bekannter Nebeneffekt des Recyclings ist, dass, wenn Ihre Datenvorlage Steuerelemente enthält, die ihren eigenen Status beibehalten, beispielsweise CheckBox, dieser Status auf das neue Element übertragen wird.

Um dieses Problem zu lösen, müssen Sie den Steuerungszustand extern verwalten, d. H. Im Ansichtsmodell. In Ihrem speziellen Fall muss die IsChecked-Eigenschaft von CheckBox an eine Eigenschaft des Ansichtsmodells gebunden sein. Und stellen Sie sicher, dass Sie eine Zwei-Wege-Bindung verwenden.

+0

Das war es, danke. Ich hatte das schon mal probiert, aber der TwoWay war das Geheimnis! – esilver

+0

Wie beeinflusst 'TwoWay' dieses Problem? – Ku6opr