1

在这个问题之后,我只是在研究 BindingList 和 ObservableCollection 之间的区别:Why NOT BindingList in WPF

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

令我惊讶的是,当 ObservableCollection 或 BindingList 被修改时,接口更新了,但在其他人被修改时却没有。那么 WPF 正在侦听导致更新的原因是什么?它不可能是 INotifyCollectionChanged 事件,正如我之前所想的那样,因为 BindingList 没有实现它。困惑。

4

1 回答 1

1

绑定列表如下所示:

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

IRaiseItemChangedEvents指示对象类将属性更改事件转换为 ListChanged 事件。 BindingList本身具有ListChangedWPF 必须监听的事件。

如果事实上它看起来像 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并亲自查看。

于 2012-03-02T13:31:09.410 回答