【问题标题】:Fire a method when collection is changed更改集合时触发方法
【发布时间】:2012-02-10 14:26:07
【问题描述】:

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

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 方法中触发它,但值是集合类型而不是 Item 类型。

【问题讨论】:

  • 我假设您的意思是价值,而不是价值。您是说该值不是 RangeObservableCollection 类型?如果是这种情况,那么 _allItems = value 应该会失败。
  • 不,我的意思是它不是 Item 类型

标签: c# wpf binding


【解决方案1】:

您可以像这样将事件附加到集合中:

_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;
         }

}

【讨论】:

    【解决方案2】:

    您需要在设置属性时附加到 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 2021-07-13
      • 1970-01-01
      相关资源
      最近更新 更多