获取CollectionChanged中的当前通用项目项

时间:2015-08-12 19:39:47

标签: c# wpf collections

我有一个继承IEnumerable的自定义集合。

func cellButtonPressed(button : UIButton){
  let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: button.tag, inSection:0)

  let longitude = cell.longitude // or whatever you store location
  let latitude = cell.latitude 

 // deal with received data

}

我希望跟踪添加或删除的项目。此外,我的项目数据绑定到WPF中的UI数据网格。如果我绑定到Items而不是MyCollection,绑定工作正常。但是,我想跟踪添加的,删除的项目,如下所示。 假设我在UI中添加或删除任何项目时会捕获以下事件。

当每一行都被添加到DataGrid时,我希望甚至可以调用它来保存最后添加的条目。

现在如何获取当前添加或删除的项目?

public class MyCollection<T> : IEnumerable<T>   
{
    private ObservableCollection<T> currentList = new ObservableCollection<T>();

    public ObservableCollection<T> Items
    {
        get { return currentList; }  
        set { currentList = value; }
    }

    private List<T> deletedList = new List<T>();
    private List<T> addedList = new List<T>();

    public MyCollection(IEnumerable<T> currentList)
    {
        this.currentList = new ObservableCollection<T>(currentList);
        Items.CollectionChanged+=Items_CollectionChanged;
    }
}

我只收到添加或删除的项目。

private void Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{  
    if (e.Action == NotifyCollectionChangedAction.Remove)
    {
        //this doesn't work  ( I List is not assignable to IEnumerable T
        deletedList.AddRange(e.OldItems);
    }

    if (e.Action == NotifyCollectionChangedAction.Add)
    {
        //this doesnt work 
        addedList.AddRange(e.OldItems);
    }
}

更新: 这里的初始答案是有效的,即Cast()选项,我只能从列表中获取添加的成员并保存它们。

还有另一个问题。我让我的服务器返回MyCollection。令人遗憾的是,当我的服务器序列化为集合对象时,它会被Items_CollectionChanged的Added事件捕获,因此我添加的List总是返回添加列表中的2个项目。

解决这个问题:

1)在服务器返回后订阅事件而不是MyCollection构造函数。在另一个StartTracking()中订阅。

2)从服务器获取响应后清除添加的deletd列表。

哪个更好?还有其他解决方案吗?

这基本上是流程:

用户界面 - &gt; OBservableCollection - &gt; MyCollection(我跟踪添加/ del元素的地方) - &gt;保存到服务器..要从服务器获取,我的服务器端代码返回MyCollectionwith条目。

1 个答案:

答案 0 :(得分:2)

OldItems不是通用的(IList不是IList<T>),因此您需要投放项目。

或者:

foreach(T item in e.OldItems)
{
    deletedList.Add(item);
}

或者:

deletedList.AddRange(e.OldItems.Cast<T>());

在跟踪添加内容时,您将要使用NewItems。另外,这不会捕获替换期间发生的更改(例如c[0] = <new item>)或重置(例如,在调用Clear之后)。

我还注意到您的GetAddedChanges可以简化(同样GetDeletedChanges):

return new ObservableCollection<T>(addedList);

虽然不清楚为什么返回类型需要ObservableCollection<T>