VirtualizingStackPanel не очищает текст TextBoxes в ItemTemplate - PullRequest
2 голосов
/ 04 октября 2011

У меня есть ItemsControl с VirtualizingStackPanel в виде панели элементов, подобной этой:

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

Я установил коллекцию из 100 000 элементов как ItemsSource и получил действительно хорошую производительность. Все хорошо, кроме одной вещи. Когда я ввожу текст в одно из текстовых полей, а затем начинаю прокручивать, я вижу, что этот текст появляется повсюду в списке!

Я понимаю, что делает VirtualizingStackPanel . Он постоянно загружает элементы, которые становятся видимыми при прокрутке. Я понимаю некоторые аспекты его техники виртуализации, но понятия не имею, как понять это странное поведение. Мне не удалось найти хорошие документы по виртуализации WPF / Silverlight, поэтому, пожалуйста, объясните мне, что происходит

Ответы [ 2 ]

6 голосов
/ 04 октября 2011

VirtualizingStackPanel фактически не загружает элементы непрерывно.Вместо этого он повторно использует существующие элементы (элементы управления) и просто заменяет DataContext позади них.

Так что, если у вас есть VirtualizingStackPanel с 100 000 элементов, и только 10 видны одновременно, он обычно отображаетоколо 14 предметов (дополнительные предметы для буфера прокрутки).При прокрутке DataContext за этими 14 элементами управления изменяется, но сами элементы управления никогда не будут заменены.

Если вы сделаете что-то вроде ввода текста в TextBox # 1, и TextBox.Text не привязанчто угодно, тогда текст всегда будет отображаться, потому что элемент управления повторно используется.Если вы привяжете TextBox.Text к значению, DataContext изменится при прокрутке, что заменит отображаемый текст.

0 голосов
/ 04 октября 2011

Не уверен, как отключить утилизацию непосредственно в VirtualizingStackPanel, но это синтаксис в ListBox. Я бы написал как комментарий, но я хотел отформатировать код.

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