2013-02-27 124 views
0

我已经绑定我的数据网格视图模型我要素的观察的集合,然后我把它连接到一个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); 

我编辑我在数据网格我的VUE,我希望能够添加/删除,更新内容,当这些操作完成后得到通知:我这样创造了这个功能:

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记录我的更改并能够在数据库中一次推送所有修改。

问题是,当我添加或删除我的数据网格中的行时,我得到的通知和列表充满了元素,但是当我更新现有行的内容时,我甚至没有收到关于通知收集改变!所以我无法保留对现有元素的修改痕迹!

有什么想法?非常感谢:) :)

回答

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 :) THX – Mohtaa 2013-02-27 17:48:17

1

ClientVM是否实现了INotifyPropertyChanged接口?另外:您正在监视集合本身的更改,而不是其项目。

CollectionChanged事件不应该在收集项目的属性发生更改时调用,但仅当收集本身发生更改时才会调用CollectionChanged事件 - 这正是您所遇到的情况。

要收到通知的各项目进行修改,我建议你订阅/从每个ClientVM实例的PropertyChanged事件/在你上面贴的代码从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) { 客户=新客户端(); Client = c; SocialIdentity = c.SocialIdentity; Phone = c.PhoneNumber; MailAddress = c.MailAddress; } //属性: 私人客户端客户端; public clients client { get {return client; } set { if(client!= value) { client = value; OnPropertyChanged(“Client”); } } }'code' – Mohtaa 2013-02-27 16:26:03

1

那是因为你的收藏,其实不变化。集合中的每个元素都是一个参考到一个对象。对象更改,但引用保持不变。因此,收集不会改变。

更新对可观察集合的操作意味着用不同元素替换元素。这不是发生在你的情况。

您需要为您的问题提供更复杂的解决方案,该解决方案还会为集合中的对象注册属性更改通知。

+0

赞!? :) :) :) – Mohtaa 2013-02-27 16:33:06