2012-05-01 54 views
3

我有一個與下面的項目模板列表框如下頁面:WP7列表框項目不同步滾動時

<ListBox x:Name="test"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
       <Grid MaxHeight="108" Margin="0,0,0,10"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="4" /> 
         <ColumnDefinition Width="auto" /> 
         <ColumnDefinition Width="*" /> 
        </Grid.ColumnDefinitions> 
        <Rectangle Height="108" Grid.Column="0" Fill="{Binding Color}"/> 
        <Image Source="{Binding Image}" Height="108" Width="108" Grid.Column="1" HorizontalAlignment="Left" Stretch="UniformToFill"/> 
        <StackPanel Grid.Column="2"> 
         <TextBlock Text="{Binding Title}" TextWrapping="NoWrap" /> 
         <TextBlock Text="{Binding SubHeading}" TextWrapping="NoWrap" /> 
         <TextBlock Text="{Binding Body}" TextWrapping="Wrap" /> 
        </StackPanel> 
       </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

在頁面的OnNavigatedTo事件,我設置了列表的項目源盒到可觀察的約20件物品的集合。

一切都很好,並且該列表已填充,但是當我向上或向下滾動列表時,項目看起來在UI上看起來不同步。例如,第一個列表項目中顯示的文本出現在列表框中的最後一個項目上,有時候會有重複項目,每次向上或向下滑動項目都不相同。

我調試了列表框項目,我可以看到正確的對象被綁定到正確的項目。所以這只是UI上顯示的內容不正確。

我也試着明確地使用標準的stackpanel而不是virtualizationstackpanel,並且通過確保所有項目都加載到內存中來解決這個問題。

我不相信刪除虛擬化就是答案。必須有根本原因。不過,它可能是可以接受的,因爲我的列表框永遠不會包含超過30個項目。

在另一頁上,我用silverlight工具包longlistselector做同樣的事情,並且有同樣的問題。不過,我不確定如何刪除longlistselector上的虛擬化。

因此,總結一下,滾動時可能導致列表框項目不能正確更新用戶界面的基礎問題是什麼?如果刪除虛擬化是唯一的答案,我怎樣才能在longlistselector上做到這一點?

感謝您的任何幫助。

+1

這是模擬器還是真正的WP7設備?我在模擬器上看到了很多視覺故障。 –

+0

嗨,它的兩個。 – FlashAsh99

+0

我應該提到的另一件事是,如果我將包含網格中的最大高度更改爲<= 80px(左右),則它工作正常。好像列表框不能處理大於80px的模板項目,其中有20個項目的列表。還是我誤會了? – FlashAsh99

回答

1

事實證明,這是一個有約束力的問題,並且與列表框無關。

我(在不知不覺中)刪除了項目模板中某些屬性的綁定,之後我綁定了它們(在其他一些代碼中)因此,每次列表框爲新項目回收容器時,它都無法更新它與正確的信息。

感謝所有的幫助

2

也許這是某種this的問題? (滾動時跳動的ListBox)

+1

跳躍列表問題是因爲您虛擬化了不同大小的項目。當不同的項目被移入和移出列表時,列表框必須適應不同的大小。還有其他解決方法基於測量和設置項目大小,但我很想好好調查您的解決方案。 –

+1

這是一個非常奇怪的問題,並且博客中的解決方案確實適用於所描述的問題(視頻)......因此,我認爲這是ListBox實現中的一個錯誤... –