Что инициирует обновление пользовательского интерфейса при изменении ItemsControl.ItemsSource? - PullRequest
1 голос
/ 02 марта 2012

Я просто изучал разницу между BindingList и ObservableCollection после этого вопроса: Почему НЕ BindingList в WPF

Как часть этого, я тестировал привязку ItemsSource элемента ItemsControl ктипы, включая List, Collection, ObservableCollection и BindingList.

Что меня удивило, так это то, что интерфейс обновлялся, когда были изменены ObservableCollection или BindingList, но не тогда, когда другие были.Так что же слушает WPF, что вызывает это обновление?Это не может быть событие INotifyCollectionChanged, как я ранее думал, потому что BindingList не реализует это.Ошеломленный.

1 Ответ

1 голос
/ 02 марта 2012

Список привязок выглядит следующим образом:

  public class BindingList<T> : Collection<T>, IBindingList, IList, ICollection, IEnumerable, ICancelAddNew, IRaiseItemChangedEvents
  {

IRaiseItemChangedEvents указывает, что класс объекта преобразует события изменения свойства в события ListChanged.BindingList само по себе имеет событие ListChanged, которое WPF должен прослушивать.

Если факт выглядит так, что IRaiseItemChangedEvents игнорируется, но есть BindingListCollectionView, который содержит

    // subscribe to change notifications
    private void SubscribeToChanges () 
    {
        if (InternalList.SupportsChangeNotification)
        {
            InternalList.ListChanged += new ListChangedEventHandler(OnListChanged); 
        }
    } 

и конструктор типа

    /// <summary> 
    /// Constructor
    /// </summary>
    /// <param name="list">Underlying IBindingList</param>
    public BindingListCollectionView(IBindingList list) 
        : base(list)
    { 
        InternalList = list; 

Я рекомендую вам овладеть DotPeek и убедиться в этом.

...