我在winforms表单上有一个绑定导航器和一个绑定源。 我的数据源来自实体框架列表。
我希望使用从Julie Lerman Course at Pluralsight
中学到的技巧来跟踪绑定源中每个实体的状态添加和编辑很简单,我只填写了添加和删除按钮事件
private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
{
((IEntity)(this.personBindingSource.Current)).State = EntityState.Added;
}
private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
{
((IEntity)(this.personBindingSource.Current)).State = EntityState.Deleted;
}
但是没有EditItemClick事件,如何跟踪实体是否已被修改?
注意我绑定到域类Person
的断开连接列表 List<Person> people = MyRepository.GetPeople();
this.personBindingSource.DataSource =people;
this.personBindingNavigator.BindingSource = this.personBindingSource;
我有一个界面IENtity
public interface IEntity
{
EntityState State { get; set; }
}
public enum EntityState
{
Unchanged,
Added,
Modified,
Deleted
}
和Person继承自那 [更新] 看一下bindingSource事件属性,我看到在修改属性时会引发CurrentItemChanged。但是当当前项目本身发生变化时也会引发它 有没有办法解决它被提出的原因?
答案 0 :(得分:0)
由于您的实体已断开连接,因此无法根据上下文进行更改跟踪,因此您需要自行跟踪更改。
如果您更改存储库方法以创建您正在检索的人员的克隆,我们可以在保存时重新连接原始实体。
List<Person> originalPeople;
List<Person> modifiablePeople = MyRepository.GetPeople(out originalPeople);
您可以阅读该部分 Creating a cloned object containing current, original, or database values了解如何创建原始人物对象的克隆。
MyRepository.SavePeople将采用两个参数,originalPeople(克隆)和modifiablePeople(修改后的人绑定到包含更改的UI)。然后,您将以未修改的状态重新附加原始人员,然后以迭代的方式应用修改后的人员的属性更改:
var entry = context.Entry(original Person);
entry.CurrentValues.SetValues(modifiedPerson);
阅读以下部分: Setting current or original values from another object
答案 1 :(得分:0)
private void bindingSource_ListChanged(object sender, ListChangedEventArgs e)
{
if (e.ListChangedType == ListChangedType.ItemChanged)
{
var entity = (IEntity)((BindingSource)sender).Current;
if (entity.State == EntityState.Unchanged)
{
entity.State = EntityState.Modified;
}
}
}