Что может заставить Virtualization ListView когда-нибудь генерировать все элементы? - PullRequest
0 голосов
/ 01 марта 2012

отредактировано для ясности:

У меня есть 2 ListView в моем приложении. Первый содержит List >. Отображение элементов в списке настроено на отображение только ключа (строки). Когда пользователь выбирает элемент в этих списках (SelectionChanged), он изменяет ItemSource моего второго ListView на Значение пары ключей.

Это находится внутри сетки с шириной столбца Авто.

<ListView ItemsSource="{Binding Path=FunctionIndex.Index}"
          Name="completeFunctionIndexView"        
          Style="{StaticResource SearchListStyle}"
          SelectionChanged="functionIndexView_SelectionChanged" />

<ListView Name="SearchResults" 
          VirtualizingStackPanel.IsVirtualizing="True"
          VirtualizingStackPanel.VirtualizationMode="Recycling">
              <ListView.View>
                 <GridView >
                    <GridViewColumn 
                                 CellTemplate="{StaticResource ElementLV}"
                                 Width="Auto"/>
                 </GridView>
              </ListView.View>
           </ListView>

Стиль SearchListStyle содержит только TextBlock, показывающий ключ (так как он содержит пары ключей). ElementLV - это небольшой текстовый блок с Runs, привязанными к различным свойствам и значениям ToString моих элементов.

private void functionIndexView_SelectionChanged(object sender, SelectionChangedEventArgs e)
     {
     //This supposes we want to support a "multiple selection search"
     //for now this isn't implemented
     List<Element> Results = new List<Element>();

     foreach (KeyValuePair<String, List<Element>> item in e.AddedItems)
        {
        Results = item.Value;
        break;
        }

     SearchResults.ItemsSource = Results;
     }

Эти списки, которые могут отображаться в представлении списка SearchResults, могут содержать большое количество элементов (более 100 КБ). Я поместил IsVirtualizing во второй список, и большую часть времени он работает как шарм.

Но иногда я не могу полностью понять, что вызывает его (может быть, слишком быстрый щелчок, чтобы выбрать элемент?), Приложение решает, что оно должно сгенерировать все элементы в списке (что явно не требуется). ..

Может ли кто-нибудь указать мне правильное направление? Есть ли причина, по которой SearchResults решит запросить генерацию всех элементов?

Может ли оно быть связано с шириной элементов и ListResults ListView, когда Измерение пытается измерить ВСЕ его элементы?

1 Ответ

0 голосов
/ 02 марта 2012

Я обнаружил ситуацию, из-за которой мой список генерировал все элементы.Это связано с ListView, чтобы не иметь указанной ширины, и быть в контейнере с Auto (столбец сетки с Auto) как ширина.Кажется, в определенном состоянии, в котором я еще не уверен, ListView пытается сгенерировать все элементы, чтобы измерить их ширину, вместо того, чтобы использовать только те, которые видны в данный момент.

Я думаю, что это не всегда так, но в этой конкретной ситуации в моем приложении, теперь это делает ...

...