显示自跟踪实体列表,并按状态对其进行过滤
本文关键字:状态 过滤 跟踪 实体 列表 显示 | 更新日期: 2023-09-27 18:05:10
我想在表单上显示一个自跟踪entities
的列表,使用标准绑定机制。
我想要的是从列表中选择实体,更改/添加或删除它们,然后根据用户的选择提交更改或拒绝它们。
据我所知,对于entities
的列表应该附加到上下文,那么应该进行accept更改调用(或者不,如果要拒绝更改)。这意味着已删除的实体也必须在列表中,标记为已删除。
但是,它们不应该再显示了。这意味着显示应该根据实体的状态进行过滤。
现在,通常要做过滤,我会在BindingList
中包装我的列表并使用过滤器属性。另一方面,实体不会立即暴露它们的安全性(与类型化数据行不同)并将它们保存在ChangeTracker.State
中。我不知所措,如何做过滤在这种情况下,特别是考虑到状态是一个enum,而不是一个普通类型。
[Edit:删除第一个包含从列表中删除实体的解决方案]
你可以给你的实体添加一个IsDeleted属性
public bool IsDeleted
{
get {
return ChangeTracker.State == ObjectState.Deleted
}
}
和该属性上的过滤器。STE是部分类,可以扩展
经过一番考虑,我发现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()。