我有一个继承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条目。
答案 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>
。