2013-08-15 1 views
0

У меня есть DataGrid WPF, для которого ItemsSource привязан к ObservableCollection>.Почему мой DataGrid заполняется только после прокрутки и выхода из вида?

Tuple - это простой класс, который я создал, который хранит 4 строки в массиве. Вот общая версия:

public class Tuple<T>: INotifyPropertyChanged 
    { 
     private int _size = 0; 

     public Tuple(int size) 
     { 
      this._size = size; 
      _objs = new T[_size]; 
     } 

     private T[] _objs; 

     public T this[int i] 
     { 
      get 
      { 
       return _objs[i]; 
      } 
      set 
      { 
       _objs[i] = value; 
       OnPropertyChanged(".[" + i + "]"); 
      } 
     } 

     public void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 

Во время компиляции я знаю, что есть 4 колонки, и поэтому я связать их с индексом кортеже. Во время выполнения Tuples добавляются в ObservableCollection и также модифицируются. Тем не менее, я бегу в проблему, где мой DataGrid только обновления, когда создается Кортеж ... То есть я получаю вывод, который выглядит следующим образом:

enter image description here

Данные присутствует в ObservableCollection, как если бы прокрутке DataGrid в и вне поля зрения, текст внутри ячеек появляется:

enter image description here

Любые советы?

+0

Если это другой набор данных, откуда вы знаете эти пробелы, Предположим, вы там? –

+0

@Bob. обновил его, чтобы отразить изменение одного и того же набора данных. Кроме того, я подтвердил это с помощью Watch on my collection и взлома во время выполнения. – Cramja

+0

Событие ObservableCollection.CollectionChanged не запускается при изменении объекта внутри, только когда _itself_ изменяется. См. [Этот ответ] (http://stackoverflow.com/a/10286028/1466627). –

ответ

2

Ваш Tuple только обновления, когда он создан, как вы не сообщаете, что определенный индекс изменился, но вся indexer property изменилась:

public T this[int i] 
{ 
    get { return _objs[i]; } 
    set 
    { 
     _objs[i] = value; 
     OnPropertyChanged(Binding.IndexerName); 
    } 
} 

, как во второй части, где появляется текст, когда он возвращается в поле зрения это связано до VirtualizingStackPanel, который по умолчанию равен true, и означает, что элементы, которые в настоящее время не отображаются, не отображаются, и их привязки не оцениваются до тех пор, пока они снова не появятся.

+0

Во-первых, это здорово. Внося изменения в OnPropertyChanged мои обновления datagrid должным образом. Я правильно понимаю это: Binding.IndexerName - это строка, представляющая индекс в моем кортеже, который изменился. Эта строка получен обработчиком ObservableCollection, который затем предупреждает DataGrid? – Cramja

+0

Это просто строка const. Поскольку свойство indexer не имеет реального имени, класс Binding предоставляет этот const, чтобы вы могли уведомить привязку о том, что что-то в индексе изменилось. – dkozl

+0

О, поэтому в нем говорится что-то вроде: «Некоторые индексы этого объекта изменились», а не: Индекс n этого объекта изменился "? – Cramja

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