我已将datagrid绑定到ViewModel元素的可观察集合,然后将其链接到NotifyCollectionChangedEventHandler事件:
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)来跟踪我的更改,并能够在数据库中推送所有修改。
问题是,当我在我的数据网格中添加或删除行时,我收到通知,列表中填充了元素,但是当我更新现有行的内容时,我甚至都没有收到关于收藏改变!!!所以我无法对现有元素进行修改!
有什么想法吗?非常感谢:):)
答案 0 :(得分: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);
}
添加新项目时也一样。在删除项目时不要忘记删除事件处理程序。
答案 1 :(得分: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
}
答案 2 :(得分:1)
这是因为您的收藏实际上是不更改。集合中的每个元素都是对象的引用。对象更改,但引用保持不变。因此,集合不会改变。
对可观察集合的更新操作意味着用不同的集合替换元素。这不是你的情况。
您的问题需要一个更复杂的解决方案,它还会在集合中的对象上注册属性更改通知。