更改集合时触发方法

时间:2012-02-10 14:26:08

标签: c# wpf binding

我有一个使用此集合的绑定:

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类型。

2 个答案:

答案 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); } }