我仍然欢迎有关更好的方法的任何建议,但以下似乎对我有用。
我创建了一个 BindingList 的衍生物来包装我的 LINQ 返回的记录,然后传递 ObjectContext 和 EntityCollection。它覆盖了 AddNewCore 和 CancelNew 以将对象以及 BindingList 放入数据库中,并且如果您将焦点移到底行但不写任何内容,它似乎会在没有不需要的空白行的情况下持久化更改。
class LinqEntityBinding<T> : System.ComponentModel.BindingList<T>
where T : System.Data.Objects.DataClasses.EntityObject
{
public LinqEntityBinding(
System.Data.Objects.ObjectContext context,
System.Data.Objects.DataClasses.EntityCollection<T> collection,
IList<T> list)
: base(list)
{
_context = context;
_collection = collection;
}
System.Data.Objects.ObjectContext _context;
System.Data.Objects.DataClasses.EntityCollection<T> _collection;
protected override object AddNewCore()
{
object obj = base.AddNewCore();
_collection.Add((T)obj);
return obj;
}
public override void CancelNew(int itemIndex)
{
object obj = Items[itemIndex];
_collection.Remove((T)obj);
if (((T)obj).EntityState != System.Data.EntityState.Detached)
{
_context.DeleteObject(obj);
}
base.CancelNew(itemIndex);
}
}
然后代替:
bindingSource.DataSource = customer.Widgets; // unsorted
我有:
bindingSource.DataSource =
new LinqEntityBinding<Widget>(db, customer.Widgets,
customer.Widgets.OrderBy(w => w.widgetness).ToList()); // sorted