ItemsControl.ItemsSource更改时触发UI更新的内容是什么?

时间:2012-03-02 13:26:13

标签: wpf collections observablecollection bindinglist inotifycollectionchanged

我正在研究BindingList和ObservableCollection之间的区别:Why NOT BindingList in WPF

作为其中的一部分,我测试了将ItemsControl的ItemsSource绑定到各种类型,包括List,Collection,ObservableCollection和BindingList。

让我感到惊讶的是,当ObservableCollection或BindingList被修改时,界面被更新,但是当其他人被修改时却没有。那么什么是WPF监听导致更新?它不能像我之前想的那样是INotifyCollectionChanged事件,因为BindingList没有实现它。困惑。

1 个答案:

答案 0 :(得分:1)

绑定列表如下所示:

  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,亲眼看看。