m.bleimuth Ответов: 1

Медленно DataGrid С ~400 строк


ПРИВЕТ,

у меня есть очень медленный ItemsControl с 5 Датагридами в нем. (дисплеи рядом друг с другом) каждый раз, когда я обновляю этот элемент управления, весь мой пользовательский интерфейс сильно отстает (~10 секунд). Каждая Datagrid имеет ~50-400 элементов с предопределенными столбцами (не автоматически генерируемыми). Itemsources сеток обновляются одновременно.

Вот мой XAML:

<pre>        <ScrollViewer Grid.Row="1">
            <ItemsControl ItemsSource="{Binding}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <UniformGrid Columns="{Binding Count}"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <DataGrid ItemsSource="{Binding Content}" RowHeight="20" AutoGenerateColumns="False" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling">
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="name" Binding="{Binding Name}" Width="100"  />
                                <DataGridTextColumn Header="value" Binding="{Binding Value}" Width="50" />
                            </DataGrid.Columns>
                        </DataGrid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
        </ScrollViewer>


А вот код за спиной:

public partial class MainWindow : Window
   {

       public List<Folder> Folders { get; set; }

       public MainWindow()
       {
           InitializeComponent();

           Folders = new List<Folder>();
           Folders.Add(new Folder());
           Folders.Add(new Folder());

           this.DataContext = Folders;
       }

       private void Button_Click(object sender, RoutedEventArgs e)
       {
           Folders.ForEach(f => f.UpdateData());
       }
   }


   public class Folder
   {
       private  Random _rand = new Random();
       public ObservableCollection<Content> Content { get; set; }

       public Folder()
       {
           Content = new ObservableCollection<Content>();
       }

       public void UpdateData()
       {
           Content.Clear();
           for(int i = 1; i <= 300; i++)
               Content.Add(new Content($"C{i}", _rand.Next(1,400)));
       }
   }

   public class Content
   {
       public string Name  { get; set; }
       public int Value    { get; set; }

       public Content(string name, int value)
       {
           Name    = name;
           Value   = value;
       }
   }



Pls найти также прилагается полный рабочий пример здесь.

Есть идеи, как я могу ускорить работу datagrids, не блокируя весь пользовательский интерфейс?

КР Ману

Что я уже пробовал:

Я попытался заменить datagrids списками, но пользовательский интерфейс все еще блокируется.
Ну, это не так уж долго блокирует, но мне нужно решение без блокировки вообще.

1 Ответов

Рейтинг:
10

Andrew Baylis

Я предполагаю, что замедление происходит, когда вы вызываете метод обновления данных в папках?

Если это так, то это, вероятно, связано с тем, что вы связали ObservableCollection как ItemsSource с вашей сеткой. Каждый раз, когда вы добавляете что-то в эту коллекцию, сетка перерисовывается (а вы добавляете 400 элементов в 5 сеток = 2000 перерисовок).

Вы бы быстрее отключили свой ItemsSource, обновили коллекцию, а затем снова подключили ItemsSource.

Кроме того, используйте коллекцию, над которой у вас есть некоторый контроль для синхронизации уведомления (я создал свой собственный класс для этой цели, который обрабатывает BlockNotifications / EnableNotifications).