[英]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.