2013-03-01 18 views
5

Mam LongListSelector WP8 z następującego wzoru:Dlaczego program WP8 LongListSelector niepoprawnie ponownie korzysta ze sprawdzonego stanu składnika 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> 

Jak widać nie ma wyboru na końcu każdej pozycji komórkowy, który umożliwia użytkownikowi wybrać kilka pozycji. IsChecked jest domyślnie fałszywy.

Problem polega na tym, że program LongListSelector wydaje się buforować stan sprawdzany mojego pola wyboru. Jeśli sprawdzę pierwszy, element, następnie przewijam w dół, po około 30 elementach, widzę inny zaznaczony element, którego nie wybrałem. Reszta wiązań działa. To tak, jakby ignorował właściwość "IsChecked" w szablonie. Próbowałem powiązać atrybut IsChecked z właściwością, bez powodzenia.

Czy ktoś wie, czy jest to błąd, a jeśli nie, w jaki sposób mogę poprawić to zachowanie?

Dzięki!

enter image description here

Odpowiedz

7

nie błąd, choć może to wyglądać na pierwszy błąd. To, co widzisz, to efekt wirtualizacji interfejsu użytkownika, w zasadzie LongListSelector przetwarza szablony danych zamiast tworzyć nowe, aby poprawić wydajność. Jednym ze znanych skutków ubocznych recyklingu jest to, że jeśli szablon danych zawiera elementy sterujące, które zachowują swój własny stan, na przykład CheckBox, ten stan przeniesie się do nowego elementu.

Aby rozwiązać ten problem, należy zarządzać stanem kontroli na zewnątrz, tj. W modelu widoku. W konkretnym przypadku właściwość IsChecked CheckBox musi być powiązana z właściwością modelu widoku. I upewnij się, że używasz wiązania dwukierunkowego.

+0

To było dzięki. Próbowałem już tego wcześniej, ale TwoWay było tajemnicą! – esilver

+0

Jak 'TwoWay' wpływa na ten problem? – Ku6opr