2013-02-27 2 views
0

я уже связан мой DataGrid к наблюдаемому коллекции моего элемента ViewModel, а затем я связал его с событием NotifyCollectionChangedEventHandler:ObservableCollection элементов обновление контента: не получать уведомления

obsListOfClients = new ObservableCollection<ClientVM>(); 
foreach (var c in contexte.listOfClients) 
{ 
    ClientVM cvm = new ClientVM(c); 
    obsListOfClients.Add(cvm); 
} 
obsListOfClients.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(collectionOfClientssChanged); 

я редактирую мой DataGrid в мой вю, я хочу, чтобы иметь возможность добавлять/удалять, обновлять содержание и получать уведомления, когда каждая из этих операций делается: я так создал эту функцию:

void collectionOfClientssChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    switch (e.Action) 
    { 
     case NotifyCollectionChangedAction.Add: 
     //Ajouter dans la base de données : 
      for(int i = 0; i<e.NewItems.Count;i++) 
      { 
       ClientVM item = e.NewItems[i] as ClientVM; 
       contexte.ListOfClientsToAdd.Add(item.Client); 
      } 
      break; 

     case NotifyCollectionChangedAction.Remove: 
      for(int i = 0; i < e.OldItems.Count; i++) 
      { 
       ClientVM item = e.OldItems[i] as ClientVM; 
       contexte.ListOfClientsToRemove.Add(item.Client); 
      } 
      break; 

     case NotifyCollectionChangedAction.Replace: 
      for(int i = 0; i < e.OldItems.Count; i++) 
      { 
       ClientVM item = e.OldItems[i] as ClientVM; 
       contexte.ListOfClientsToUpdate.Add(item.Client); 
      } 
      break; 
    } 
} 

Затем я использую мои три списка (ListOfClientsToUpdate, ListOfClientsToRemove, ListOfClientsToAdd) t o Следите за моими изменениями и сможете вносить все изменения в базу данных.

Проблема в том, что когда я добавляю или удаляю строки в своем datagrid, я получаю уведомление, а списки заполняются элементами, но когда я обновляю содержимое существующей строки, я даже не получаю уведомление о коллекция меняется !!! поэтому я не могу отслеживать мои изменения в существующих элементах!

Любая идея? спасибо большое :) :)

ответ

1

Чтобы обнаружить изменение элемента в списке, вам необходимо прослушать изменения свойств на ClientVM, поскольку они не учитываются как изменения в списке клиентов.

Очень грубо говоря, вы могли бы сделать что-то вроде:

obsListOfClients = new ObservableCollection<ClientVM>(); 
foreach (var c in contexte.listOfClients) 
{ 
    ClientVM cvm = new ClientVM(c); 
    // NEW BIT HERE 
    cvm.PropertyChanged += ClientVMChangedEventHandler; 
    obsListOfClients.Add(cvm); 
} 
obsListOfClients.CollectionChanged += ...; 

private void ClientVMChangedEventHandler(object sender, 
             PropertyChangedEventArgs e) 
{ 
    contexte.ListOfClientsToUpdate.Add(((ClientVM)sender).Client); 
} 

И сделать то же самое, когда вы добавляете новые элементы. Не забывайте удалять обработчик событий при удалении элементов.

+0

Yeaaaaaaaaaaaaaay :) ТНХ – Mohtaa

1

Выполняет ClientVM интерфейс INotifyPropertyChanged? Кроме того: вы отслеживаете изменения самой коллекции, а не их элементов.

Событие CollectionChanged не должно вызываться, когда свойство элемента коллекции изменяется, но только при изменении самой коллекции - это то, что вы испытываете.

Чтобы получить уведомление об изменениях для отдельных элементов, я предлагаю вам подписаться/отписаться от PropertyChanged событий каждого ClientVM экземпляра, который добавляется/замененными/удалено из ObservableCollection в коде, который вы публикуемая выше. Пример для добавления и удаления случае могут быть:

switch (e.Action) 
{ 
    case NotifyCollectionChangedAction.Add: 
     for(int i = 0; i<e.NewItems.Count;i++) 
     { 
      ClientVM item = e.NewItems[i] as ClientVM; 
      item.PropertyChanged += ItemPropertyChanged; 
      contexte.ListOfClientsToAdd.Add(item.Client); 
     } 
     break; 

    case NotifyCollectionChangedAction.Remove: 
     for(int i = 0; i < e.OldItems.Count; i++) 
     { 
      ClientVM item = e.OldItems[i] as ClientVM; 
      item.PropertyChanged -= ItemPropertyChanged; 
      contexte.ListOfClientsToRemove.Add(item.Client); 
     } 
     break; 
} 

С ItemPropertyChanged является обработчик события:

private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    // Handle property change here 
} 
+0

Да, он реализует его: 'code' общественного класса ClientVM: ViewModelBase { // Constructeurs: общественного ClientVM (клиенты с) { клиента = новых клиентов(); Клиент = c; SocialIdentity = c.SocialIdentity; Телефон = c.PhoneNumber; MailAddress = c.MailAddress; } // Attributes: частный клиент клиентов; public Клиенты Клиент { get {return client; } { если (клиент! = Значение) { клиент = значение; OnPropertyChanged («Клиент»); } } } 'code' – Mohtaa

1

Это потому, что ваша коллекция, по сути, делает не изменений. Каждый элемент в вашей коллекции - это ссылка на объект. Объект изменяется, но ссылка остается прежней. Поэтому коллекция не меняется.

обновление операция на наблюдаемой коллекции означает замену элемента на другой. Это не то, что происходит в вашем случае.

Вам понадобится более сложное решение для вашей проблемы, которое также регистрируется для уведомления об изменении свойств объектов в коллекции.

+0

Нравится!? :) :) :) – Mohtaa

Смежные вопросы