1

entities標準のバインディング メカニズムを使用して、フォームにセルフ トラッキングのリストを表示したいと考えています。

私が望むのは、リストからエンティティを選択し、それらを変更/追加または削除してから、ユーザーの選択に応じて変更を送信または拒否することです。

私が理解している限りでは、そのリストをentitiesコンテキストに添付する必要があるため、accept changes 呼び出しを行う必要があります (または、変更を拒否する場合)。つまり、削除されたエンティティもリストに含まれ、削除済みとしてマークされている必要があります。

ただし、それらはもう表示されるべきではありません。つまり、エンティティの状態によって表示をフィルタリングする必要があります。

ここで、通常はフィルタリングを行うために、リストをラップし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 に答える