想来想去,发现BindingList
不支持过滤,技术上也是如此BindingSource
。
因此,在没有问题的标准过滤的情况下,我编写了自己的实现,如下所示:
private class LivingBindingList : BindingList<Producer>
{
public LivingBindingList(List<Producer> source)
: base(source.Where(producer => producer.ChangeTracker.State != ObjectState.Deleted).ToList())
{
rem_cache = source.Where(producer => producer.ChangeTracker.State == ObjectState.Deleted).ToList();
}
List<Producer> rem_cache;
protected override void RemoveItem(int index)
{
this.Items[index].MarkAsDeleted();
this.rem_cache.Add(this.Items[index]);
base.RemoveItem(index);
}
protected override void OnAddingNew(AddingNewEventArgs e)
{
e.NewObject = new Producer()
{
NameProducer = "Новый производитель",
GUID = Guid.NewGuid(),
Type = 1,
Note = String.Empty
};
base.OnAddingNew(e);
}
internal IEnumerable<Producer> GetAllForSubmit()
{
return this.Items.Concat(rem_cache);
}
}
有了这个,我可以绑定到列表,根据需要添加和删除,并且提交目的使用 GetAllForSubmit() 检索所有记录,包括死记录。