2014-02-14 33 views
0

有没有办法在ObservableCollection中添加新项目或更新现有项目时获取通知或事件。说如何在ObservableCollection对象中获取更改通知

class Notify:INotifyPropertyChanged 
{ 
    private string userID { get; set; } 
    public string UserID 
    { 
     get { return userID; } 

     set 
     { 
      if (userID != value) 
      { 
       userID = value; 
       OnPropertyChanged("UserID"); 
      } 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

class MainClass 
{ 

    ObservableCollection<Notify> notifyme = new ObservableCollection<Notify>(); 


changed() 
{ 
    //logic where there is an update 
} 

} 

当我称()改变

回答

2

只有真正一个办法做到这一点:挂钩,在每个项目的事件处理程序(或之前),将其添加到的ObservableCollection。

notifyme.Add(new Notify{ PropertyChanged += (o, e) => { do whatever }}); 

这是因为ObservableCollection只是一个容器,它的每个项目都必须单独挂钩。当然,你可以编写自己的扩展类(或扩展方法)来帮助实现自动化。

1

我认为INotifyPropertyChanged会通知propertychanged事件,但在这里我认为您的集合已更改。所以你必须提出一个CollectionChanged事件。

我建议你看看thisthis

希望这对你有所帮助!

1

您可以使用类似这样

public class NotifyCollection 
{ 
    private readonly ObservableCollection<Notify> collection; 

    public NotifyCollection() 
    { 
     collection = new ObservableCollection<Notify>(); 
     collection.CollectionChanged += collection_CollectionChanged; 
    } 

    private void collection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if ((e.Action == NotifyCollectionChangedAction.Remove || e.Action == NotifyCollectionChangedAction.Replace) && e.OldItems != null) 
     { 
      foreach (var oldItem in e.OldItems) 
      { 
       var item = (Notify)oldItem; 
       try 
       { 
        item.PropertyChanged -= notify_changes; 
       } 
       catch { } 
      } 
     } 

     if((e.Action==NotifyCollectionChangedAction.Add || e.Action==NotifyCollectionChangedAction.Replace) && e.NewItems!=null) 
     { 
      foreach(var newItem in e.NewItems) 
      { 
       var item = (Notify)newItem; 
       item.PropertyChanged += notify_changes; 
      } 
     } 

     notify_changes(null, null); 
    } 

    private void notify_changes(object sender, PropertyChangedEventArgs e) 
    { 
     //notify code here 
    } 

    public ObservableCollection<Notify> Collection 
    { 
     get 
     { 
      return collection; 
     } 
    } 
} 
相关问题