我有一个使用此集合的绑定:
private RangeObservableCollection<Item> _allItems;
public RangeObservableCollection<Item> AllItems
{
get { return _allItems; }
set { _allItems = value; }
}
RangeObservarbleCollection是一个集合,在调用AddRange方法时只抛出一个集合被更改的通知。
我有另一个集合,其项目取决于AllItems集合的项目。
private RangeObservableCollection<Item> _commonItems;
我希望每当AllItems集合被更改为触发一个方法,该方法执行一些计算并更改CommonItems集合中的项目。我尝试在AllItems集合的set方法中触发它,但Value的类型集合不是Item类型。
答案 0 :(得分:5)
您可以将事件附加到集合上,如下所示:
_allItems.CollectionChanged += new NotifyCollectionChangedEventHandler(_allItems_CollectionChanged)
protected void _allItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
//do stuff;
break;
case NotifyCollectionChangedAction.Remove:
//do stuff
break;
}
}
答案 1 :(得分:0)
您需要在设置属性时附加到AllItems集合上的事件,并在清除它时分离。然后从AllItems事件的处理程序中激活您的事件。
public RangeObservableCollection<Item> AllItems
{
get { return _allItems; }
set
{
if (_allItems != null)
{
_allItems.CollectionChanged -= AllItems_CollectionChanged;
}
_allItems = value; }
if (_allItems != null)
{
_allItems.CollectionChanged +-= AllItems_CollectionChanged;
}
}
private void AllItems_CollectionChanged(object sender, CollectionChangedEventArgs e)
{
OnCollectionChanged(e);
}
private void OnCollectionChanged(CollectionChangedEventArgs args)
{
EventHandler<CollectionChangedEventArgs> temp = CollectionChanged;
if (temp != null)
{
temp.Invoke(this, args);
}
}
public RangeObservableCollection<Item> AllItems
{
get { return _allItems; }
set
{
if (_allItems != null)
{
_allItems.CollectionChanged -= AllItems_CollectionChanged;
}
_allItems = value; }
if (_allItems != null)
{
_allItems.CollectionChanged +-= AllItems_CollectionChanged;
}
}
private void AllItems_CollectionChanged(object sender, CollectionChangedEventArgs e)
{
OnCollectionChanged(e);
}
private void OnCollectionChanged(CollectionChangedEventArgs args)
{
EventHandler<CollectionChangedEventArgs> temp = CollectionChanged;
if (temp != null)
{
temp.Invoke(this, args);
}
}