2017-01-25 15 views
1

У меня есть TabControl с тремя TabItems. Каждый TabItem имеет свой собственный ViewModel. Последняя вкладка содержит ListView с +1500 записями. Поэтому каждый раз, когда я открываю эту вкладку, для рендеринга требуется +10 секунд. Я хочу оптимизировать ListView, поэтому это не займет много времени, чтобы визуализировать каждый раз.Плохое представление ListView в TabControl WPF

Я привязываю ObservableCollection к ListView.

ListView выглядит следующим образом

<ListView> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn> 
       <GridViewColumnHeader> 
        <TextBox... custom templates for filtering here 
       </GridViewColumnHeader> 
      </GridViewColumn> 
      </GridView> 
    <ListView.View> 
</ListView> 

Я уже пробовал:

<VirtualizingPanel.VirtualizationMode="Recycling"> 

Это ускоряет его, но делает прокрутку reeeeeeeally медленно.

ответ

1

Я думаю, что вы можете отделить свою большую коллекцию на нескольких небольших страницах (20/50 предметов) и немного добавить новые предметы. Я могу порекомендовать вам использовать Behavior для обновления страницы. Просто привяжите команду awaitable для добавления новых элементов в коллекцию. Новые элементы будут добавляться при скроллинге вниз.

internal class ScrollEndToCommandBehavior : Behavior<ScrollViewer> 
{ 
    #region Public Static Fields and Constants 

    public static readonly DependencyProperty CommandParameterProperty = 
     DependencyProperty.Register("CommandParameter", typeof (object), typeof (ScrollEndToCommandBehavior), new PropertyMetadata(null)); 

    public static readonly DependencyProperty CommandProperty = 
     DependencyProperty.Register("Command", typeof (ICommand), typeof (ScrollEndToCommandBehavior), new PropertyMetadata(null)); 

    #endregion 

    #region Public Properties 

    public ICommand Command 
    { 
     get { return (ICommand) GetValue(CommandProperty); } 
     set { SetValue(CommandProperty, value); } 
    } 


    public object CommandParameter 
    { 
     get { return GetValue(CommandParameterProperty); } 
     set { SetValue(CommandParameterProperty, value); } 
    } 

    #endregion 

    #region Protected Methods 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.ViewChanged += AssociatedObjectOnViewChanged; 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.ViewChanged -= AssociatedObjectOnViewChanged; 
     base.OnDetaching(); 
    } 

    #endregion 

    #region Private Methods 

    private void AssociatedObjectOnViewChanged(object sender, ScrollViewerViewChangedEventArgs eventArgs) 
    { 
     if (!eventArgs.IsIntermediate && Math.Abs(AssociatedObject.ScrollableHeight - AssociatedObject.VerticalOffset) < 5) 
     { 
      Command?.Execute(CommandParameter); 
     } 
    } 

    #endregion 
} 
+0

Спасибо! После некоторых модификаций это работало как шарм. Стоит упомянуть, что 'ViewChanged' предназначен только для UWP. Если кто-то хочет использовать это с WPF, используйте 'ScrollChanged'. Я также изменил поведение, поэтому его можно привязать к самому «ListView», а в «OnAttaching» я извлекаю «ScrollViewer» из «ListView». Еще раз спасибо :) –

+0

И Win 8.x + WinPhone ... –