Зависание при привязке данных большого количества данных к WPF DataGrid - PullRequest
0 голосов
/ 04 мая 2010

Я использую WPFToolkit datagrid control и выполняю привязку таким образом:

<WpfToolkit:DataGrid x:Name="dgGeneral" SelectionMode="Single"
                              SelectionUnit="FullRow"
                              AutoGenerateColumns="False"
                              CanUserAddRows="False"
                              CanUserDeleteRows="False" 
                              Grid.Row="1"  ItemsSource="{Binding Path=Conversations}" >


public List<CONVERSATION> Conversations
        {
            get { return conversations; }
            set
            {
                if (conversations != value)
                {
                    conversations = value;
                    NotifyPropertyChanged("Conversations");
                }
            }
        }  

public event PropertyChangedEventHandler PropertyChanged; 

public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

public void GenerateData()
         {
            BackgroundWorker bw = new BackgroundWorker();

            bw.WorkerSupportsCancellation = bw.WorkerReportsProgress = true;
            List<CONVERSATION> list = new List<CONVERSATION>();

            bw.DoWork += delegate { list = RefreshGeneralData(); };

            bw.RunWorkerCompleted += delegate
                                         {
                                             try
                                             {
                                                 Conversations = list;
                                             }
                                             catch (Exception ex)
                                             {
                                                 CustomException.ExceptionLogCustomMessage(ex);
                                             }

                                         };

            bw.RunWorkerAsync();
        }


И затем в главном окне я вызываю GenerateData () после установки DataCotext окна для экземпляра класса, содержащего GenerateData ().

RefreshGeneralData () возвращает некоторый список данных, которые мне нужны, и возвращает их быстро.
Всего около 2000 записей и 6 столбцов (я не публикую код, который я использовал во время инициализации сетки, потому что я не думаю, что это может быть причиной), и сетка зависает почти 10 секунд!
---
PS Я нашел проект, который написан подобным образом, но даже привязка 50000 записей выполняется без UI, висят там! Что я делаю не так?
ОБНОВЛЕНИЕ Я думаю, что это из-за ScrollViewer, который содержит всю сетку в нем. Но почему?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2010

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

Проблема в том, что свойство width сетки контейнера для сетки данных имеет значение Auto . Моя сетка данных имеет только около 500 строк с 5 столбцами в каждой строке, но в этом автоматическом режиме она висит навсегда. Однажды я изменил его на * или фиксированную ширину. Это прямо сейчас.

1 голос
/ 04 мая 2010

Если вы явно не отключите его, элементы в DataGrid будут виртуализированы, то есть будут отображаться только отображаемые элементы. У вас могут быть проблемы из-за автоматизации пользовательского интерфейса (это было исправлено в .NET 4). Смотри http://wpf.codeplex.com/Thread/View.aspx?ThreadId=41964

Это может произойти, если у вас установлен планшет Wacom или программа чтения с экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...