我想使用标准绑定机制在表单上显示自我跟踪entities
列表。
我想要的是从列表中选择entites,更改/添加或删除它们,然后根据用户选择提交更改或拒绝它们。
据我了解,为此entities
列表应附加到上下文中,然后应该进行接受更改调用(如果要拒绝更改,则不进行调用)。这意味着已删除的实体也必须在列表中,标记为已删除。
但是,它们不应再显示了。这意味着显示应该按实体状态进行过滤。
现在,通常要进行过滤我会将我的列表包装在BindingList
中并使用Filter属性。另一方面,entites不会立即暴露他们的状态(与类型化数据行不同)并将其保存在ChangeTracker.State
中。我很茫然,在这种情况下如何进行过滤,特别是考虑到状态是一个枚举,而不是简单的类型。
答案 0 :(得分:1)
[编辑:删除了第一个解决方案,包括从列表中删除实体]
您可以向实体添加IsDeleted属性
public bool IsDeleted
{
get {
return ChangeTracker.State == ObjectState.Deleted
}
}
并过滤该属性。 STE是部分类,可以扩展
答案 1 :(得分:0)
经过深思熟虑,我发现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()检索所有记录,包括死记录。