2011-10-04 54 views
2

的ItemsControlVirtualizingStackPanel作爲項目小組是這樣的:VirtualizingStackPanel不清除文本框的文本在ItemTemplate

<ItemsControl Style="{StaticResource ItemsControl}" Name="itemsControl" 
       Margin="0,100,0,0" HorizontalAlignment="Stretch" Height="80"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <TextBox />      
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate>      
       <VirtualizingStackPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
</ItemsControl> 

風格是以下幾點:

<Style x:Key="ItemsControl" TargetType="ItemsControl"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ItemsControl"> 
       <ScrollViewer VerticalScrollBarVisibility="Hidden" 
           HorizontalScrollBarVisibility="Visible"> 
        <ItemsPresenter /> 
       </ScrollViewer> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

我設置作爲ItemsSource 100.000元素的集合,並獲得非常好的表現。除了一件事以外,一切都很好。當我在其中一個文本框中輸入文本,然後開始滾動時,我看到該文本出現在整個列表中的任何地方!

我明白VirtualizingStackPanel是做什麼的。它不斷加載在滾動時可見的元素。我理解它的虛擬化技術的一些方面,但我不知道如何理解這種奇怪的行爲。我沒有找到關於WPF/Silverlight虛擬化的好文檔,所以,請解釋我發生了什麼

+0

我對datagird中的單選按鈕有同樣的問題,並通過爲每個單元添加單獨的編輯模板來解決它。感謝@Rachel,現在很清楚如何解決這類問題 –

回答

6

VirtualizingStackPanel實際上不會連續加載元素。相反,它重新使用現有的元素(控件)並簡單地替換它們後面的DataContext。

因此,如果您有一個VirtualizingStackPanel 100,000個項目,並且一次只能看到10個項目,它通常會呈現大約14個項目(滾動緩衝區的額外項目)。當您滾動時,這14個控件背後的DataContext會發生更改,但實際控件本身永遠不會被替換。

如果您在文本框#1中輸入文本,並且TextBox.Text未綁定任何內容,則文本將始終顯示,因爲該控件正在重新使用。如果你將TextBox.Text綁定爲一個值,那麼當你滾動時DataContext將會改變,這將取代顯示的文本。

+0

謝謝,現在已經足夠清楚了! – EvAlex

0

不知道如何直接關閉VirtualizingStackPanel中的回收功能,但這是ListBox中的語法。我會張貼評論,但我想格式化的代碼。

<ListBox VirtualizingStackPanel.VirtualizationMode="Standard" /> 
+0

您仍然可以在註釋中添加代碼行,但在代碼塊周圍添加一個「反引號」,儘管它不會着色或讓您執行多行代碼 – Rachel

+0

什麼是反引號? – Paparazzi

+0

這是在標準美式鍵盤上的[Tab]鍵上方的關鍵。它與Tilde('〜')共享密鑰。 – Rachel