[英]Displaying list of self-tracking entities, filtering them by state
我想使用标准绑定机制在表单上显示自跟踪entities
的列表。
我想要的是从列表中选择实体,更改/添加或删除它们,然后根据用户选择提交更改或拒绝它们。
据我了解,对于entities
列表应该附加到上下文的情况,则应该进行一个接受更改调用(或者,如果要拒绝更改,则不进行)。 这意味着删除的实体也必须在列表中,并标记为已删除。
但是,不应再显示它们。 这意味着显示应按实体状态过滤。
现在,通常要进行过滤,我将列表包装在BindingList
并使用Filter属性。 另一方面,实体不会立即暴露其状态(与键入的数据行不同),而不会将它们保存在ChangeTracker.State
。 我很茫然,在这种情况下如何进行过滤,尤其是考虑到状态是一个枚举,而不是普通类型。
[编辑:删除了从列表中删除实体组成的第一个解决方案]
您可以将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()检索所有记录,包括失效的记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.