我认为这是一个愚蠢的问题,但是......
我有一个带有Treeview
绑定到Observablecollection<T> foo;
T的Window类是我的类(在另一个文件.cs中)。
我的Observablecollection foo
有OnPropertyChanged
添加/删除元素,工作正常。
问题出在我的班级T上:它有5个属性,其中一个有OnPropertyChanged
:当我以编程方式更改我的班级元素时,TI OnPropertyChanged
中有class T
(显然)但...我如何才能从Window
课程中了解它做什么?
答案 0 :(得分:0)
您希望能够在observable集合中的项目上监听propertychange事件吗?
为此,我创建了一个ObsercableCollection扩展,将这些事件冒泡到集合级别,因此我可以订阅collection.CollectionChanged(添加和删除项)和collection.ItemInCollectionChange(集合中项目的属性具有改变后的):
//public class ItemInCollectionChangeEventArgs
public class ItemInCollectionChangeEventArgs : EventArgs
{
public object Item { get; internal set; }
public PropertyChangedEventArgs PropertyChangedEventArgs { get; internal set; }
}
public delegate void ItemInCollectionChangeEventHandler(Object sender, ItemInCollectionChangeEventArgs e);
//TODO Make this throw a separate event for refreshing
public class ItemsChangeObservableCollection<T> :
ObservableCollection<T> where T : INotifyPropertyChanged
{
public event ItemInCollectionChangeEventHandler ItemInCollectionChangeEvent;
public ItemsChangeObservableCollection() : base()
{
}
public ItemsChangeObservableCollection(IEnumerable<T> collection) : base()
{
foreach (T item in collection)
{
Add(item);
}
}
protected virtual void OnItemInCollectionChange(ItemInCollectionChangeEventArgs e)
{
ItemInCollectionChangeEventHandler handler = ItemInCollectionChangeEvent;
if (handler != null)
{
handler(this, e);
}
}
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
RegisterPropertyChanged(e.NewItems);
}
else if (e.Action == NotifyCollectionChangedAction.Remove)
{
UnRegisterPropertyChanged(e.OldItems);
}
else if (e.Action == NotifyCollectionChangedAction.Replace)
{
UnRegisterPropertyChanged(e.OldItems);
RegisterPropertyChanged(e.NewItems);
}
base.OnCollectionChanged(e);
}
protected override void ClearItems()
{
UnRegisterPropertyChanged(this);
base.ClearItems();
}
private void RegisterPropertyChanged(IList items)
{
foreach (INotifyPropertyChanged item in items)
{
if (item != null)
{
item.PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
}
}
}
private void UnRegisterPropertyChanged(IList items)
{
foreach (INotifyPropertyChanged item in items)
{
if (item != null)
{
item.PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);
}
}
}
private void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
OnItemInCollectionChange(new ItemInCollectionChangeEventArgs { Item = sender, PropertyChangedEventArgs = e });
//base.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}