2014-02-14 4 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.

Я предложу вам ознакомиться с this и this.

Надеюсь, это поможет вам !!!!

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; 
     } 
    } 
} 
Смежные вопросы