1

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

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

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

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

现在,通常要进行过滤,我会将列表包装起来BindingList并使用 Filter 属性。另一方面,实体不会立即公开他们的状态(与键入的数据行不同)并将它们保存在ChangeTracker.State. 我很茫然,在这种情况下如何进行过滤,特别是考虑到状态是枚举,而不是普通类型。

4

2 回答 2

1

[编辑:删除包含从列表中删除实体的第一个解决方案]

您可以向您的实体添加 IsDeleted 属性

public bool IsDeleted
{ 
    get {
        return ChangeTracker.State == ObjectState.Deleted
    } 
}

并过滤该属性。STE 是部分类,可以扩展

于 2013-03-22T10:15:19.347 回答
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() 检索所有记录,包括死记录。

于 2013-03-22T12:26:35.090 回答