2010-05-04 3 views
0

Im используя управление WPFToolkit Datagrid и делать связывание таким образом:
Повесьте во привязки данных большого объема данных в WPF DataGrid

<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(); 
     } 


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

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

+1

... и на ваш вопрос? –

+0

вопрос: как я могу ускорить привязку? – 0x49D1

+0

или, может быть, вы можете просто дать мне направление. О том, как правильно привязывать данные к datagrid. Im новый для WPF и не ожидал таких проблем – 0x49D1

ответ

1

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

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

+0

Нет .. Я использую профиль клиента .NET4 и обычный ПК. – 0x49D1

+0

Хм. Возможно, вы могли бы написать больше кода? В частности, полный XAML DataGrid. Служит ли зависание после того, как вы назначили данные (раздел 'Conversations = list;'). Вы уверены, что вы назначаете его только один раз, и данные не меняются впоследствии? –

+0

Я назначаю только один раз, и зависание происходит сразу после Разговора = список; – 0x49D1

2

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

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

Смежные вопросы