2012-02-20 2 views
1

Я просматривал сайт Microsoft и был догнал, прочитав ObservableCollection<T>.При привязке ObservableCollection <T> к ListView, как ListView пытается получить данные для отображения?

Я придумал быстрый сценарий в своей голове и решил, что могу использовать что-то вроде этого.

Я сделал класс образца, который inherets от ObservableCollection <T>, как показано здесь:

public class Ledger : ObservableCollection<LedgerEntry>, IEnumerable 
{ 
    private ObservableCollection<LedgerEntry> _items; 
    private decimal _currentBalance; 

    public Ledger(IEnumerable<LedgerEntry> items) 
     : base(items) 
    { 
     _items = new ObservableCollection<LedgerEntry>(items); 
     _currentBalance = 0m; 
    } 

    public new IEnumerator GetEnumerator() 
    { 
     var enumerator = _items.GetEnumerator(); 

     while (enumerator.MoveNext()) 
     { 
      var currentItem = enumerator.Current; 

      _currentBalance += currentItem.Amount; 
      currentItem.SetBalance(_currentBalance); 

      yield return currentItem; 
     } 
    } 
} 

Подумайте о банковском счете - Я хотел бы для каждого LedgerEntry, содержащейся в коллекции «знать» это баланс.

Любой, кто -

Что мне интересно, это - с учетом приведенных выше примеров, я вижу, что GetEnumerator() вызывается один раз, когда я привязать его к ListView, и теперь мне очень интересно - - как ListView фактически извлекает/просматривает данные, содержащиеся в коллекции?

Моя мысль состояла в том, что она будет перебирать перечислимые числа, но, по-видимому, я ошибаюсь.

Любая информация о том, как это работает?

Спасибо!

ответ

1

Если коллекция реализует IList<T>, которая будет использоваться для доступа к элементам по индексу.

+0

Что-то странное в том, что метод GetEnumerator вызывается один раз, если я непосредственно реализую IEnumerable, но он вообще не вызывается, если я принимаю «, IEnumerable» от подписи класса. –

+0

@IanP: Хмм, не знаю всей специфики, много странностей, которые нужно найти ... –

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