我正在研究BindingList和ObservableCollection之间的区别:Why NOT BindingList in WPF
作为其中的一部分,我测试了将ItemsControl的ItemsSource绑定到各种类型,包括List,Collection,ObservableCollection和BindingList。
让我感到惊讶的是,当ObservableCollection或BindingList被修改时,界面被更新,但是当其他人被修改时却没有。那么什么是WPF监听导致更新?它不能像我之前想的那样是INotifyCollectionChanged事件,因为BindingList没有实现它。困惑。
答案 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,亲眼看看。