显示自跟踪实体列表,并按状态对其进行过滤

本文关键字:状态 过滤 跟踪 实体 列表 显示 | 更新日期: 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()。