1

この質問に続いて、BindingList と ObservableCollection の違いを調べていました: Why NOT BindingList in WPF

この一環として、ItemsControl の ItemsSource を List、Collection、ObservableCollection、BindingList などのさまざまな型にバインドするテストを行いました。

私が驚いたのは、ObservableCollection または BindingList のいずれかが変更されたときにインターフェイスが更新され、他のものが変更されたときに更新されなかったことです。では、WPF がリッスンしているのは、その更新の原因となるものでしょうか? BindingList はそれを実装していないため、以前に考えたように、INotifyCollectionChanged イベントにすることはできません。当惑した。

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 に答える