0

我已将我的数据网格绑定到我的 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)来跟踪我的更改并能够在数据库中推送所有修改。

问题是,当我在数据网格中添加或删除行时,我收到通知并且列表中充满了元素,但是当我更新现有行的内容时,我什至没有收到有关集合更改的通知! !!所以我无法跟踪我对现有元素的修改!

任何的想法 ?多谢 :) :)

4

3 回答 3

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);
}

添加新项目时也这样做。删除项目时不要忘记删除事件处理程序。

于 2013-02-27T16:13:51.360 回答
1

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

CollectionChanged当集合项的属性发生更改时,不应调用该事件,而仅当集合本身发生更改时才调用该事件-这就是您所经历的。

要获得有关单个项目更改的通知,我建议您订阅/取消订阅从您上面发布的代码中添加/替换/删除PropertyChanged的每个实例的事件。添加和删​​除案例的示例可能是:ClientVMObservableCollection

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
}
于 2013-02-27T16:14:01.797 回答
1

那是因为您的收藏实际上并没有改变。集合中的每个元素都是对对象的引用。对象发生了变化,但引用保持不变。因此,集合不会改变。

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

您将需要一个更复杂的解决方案来解决您的问题,该解决方案还注册集合中对象的属性更改通知。

于 2013-02-27T16:14:54.740 回答