2013-03-01 19 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似乎在緩存我的複選框的選中狀態。如果我檢查第一個項目,然後向下滾動中間,大約30個左右的項目後,我看到另一個項目被檢查,我沒有選擇。其餘的綁定工作。就好像它忽略了模板中的「IsChecked」屬性。我嘗試將IsChecked屬性綁定到屬性,但沒有運氣。

有誰知道這是否是一個錯誤,如果沒有,我該如何糾正這種行爲?

謝謝!

enter image description here

回答

7

不是一個錯誤,雖然它可能看起來像一個bug在第一。你看到的是UI虛擬化的效果,基本上LongListSelector回收數據模板而不是創建新模板來提高性能。回收的一個已知的副作用是,如果您的數據模板包含保持其自身狀態的控件,例如CheckBox,那麼該狀態將轉移到新項目。

要解決此問題,您需要在外部管理控制狀態,即在視圖模型中。在你的特定情況下,CheckBox的IsChecked屬性必須綁定到視圖模型的屬性。並確保使用雙向綁定。

+0

這是它的感謝。我曾嘗試過,但TwoWay是祕密! – esilver 2013-03-02 01:03:51

+0

'雙向'如何影響這個問題? – Ku6opr 2015-03-27 12:38:09

相關問題