显示自跟踪实体列表,按状态过滤它们

时间:2013-03-22 10:00:55

标签: c# winforms data-binding entity-framework-4 self-tracking-entities

我想使用标准绑定机制在表单上显示自我跟踪entities列表。

我想要的是从列表中选择entites,更改/添加或删除它们,然后根据用户选择提交更改或拒绝它们。

据我了解,为此entities列表应附加到上下文中,然后应该进行接受更改调用(如果要拒绝更改,则不进行调用)。这意味着已删除的实体也必须在列表中,标记为已删除。

但是,它们不应再显示了。这意味着显示应该按实体状态进行过滤。

现在,通常要进行过滤我会将我的列表包装在BindingList中并使用Filter属性。另一方面,entites不会立即暴露他们的状态(与类型化数据行不同)并将其保存在ChangeTracker.State中。我很茫然,在这种情况下如何进行过滤,特别是考虑到状态是一个枚举,而不是简单的类型。

2 个答案:

答案 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()检索所有记录,包括死记录。