C# 如何防止CurrencyManager为绑定对象调用BeginEdit()/EndEdit()方法

C# 如何防止CurrencyManager为绑定对象调用BeginEdit()/EndEdit()方法,c#,winforms,data-binding,ieditableobject,currencymanager,C#,Winforms,Data Binding,Ieditableobject,Currencymanager,我有一个表单,有几个文本框和一个数据网格。一个业务实体可以绑定到此表单。例如,BO看起来像这样: class BO : IEditableObject, INotifyPropertyChanged { public string FirstName {get; set;} public string LastName {get; set} public BindingList<BO> Relatives {get; set} // implementation of

我有一个表单,有几个文本框和一个数据网格。一个业务实体可以绑定到此表单。例如,BO看起来像这样:

class BO : IEditableObject, INotifyPropertyChanged
{
  public string FirstName {get; set;}
  public string LastName {get; set}
  public BindingList<BO> Relatives {get; set}
  // implementation of the interfaces

}
类BO:IEditableObject,INotifyPropertyChanged
{
公共字符串名{get;set;}
公共字符串LastName{get;set}
公共绑定列表相关项{get;set}
//接口的实现
}
因此在表单上,FirstName和LastName绑定到文本框,亲属绑定到网格。在表单上,我还有保存和取消按钮。单击“保存”按钮时,我调用IEditableObject.EndEdit();单击“取消”按钮时,我调用IEditableObject.CancelEdit()。我希望CancelEdit()方法拒绝用户所做的所有更改,包括绑定到网格的亲属中的更改。到目前为止还不错

但是 网格控件使用CurrencyManager(网格实际上是Devexpress控件,但这并不重要,因为我相信WinForms控件也使用它)。并且,每当用户更改行时,CurrencyManager都会调用BeginEdit()&EndEdit(),用于亲属集合中的项。因此,当单击按钮Cancel()时,只有FirstName&LastName中的更改将被取消,因为对于Relatives集合中的子对象,EndEdit()已被网格的底层CurrencyManager调用!所以,问题是-如何防止CurrencyManager调用该方法,以便我可以通过一次调用拒绝所有更改


谢谢

您唯一的解决方案是从业务对象中删除
IEditableObject
的实现。当绑定对象更改时,
CurrencyManager
(用于Winforms中的所有绑定)会自行执行此操作


您必须更改逻辑以处理更高级别的更改跟踪,或者从类中删除接口,但保留方法。这样做意味着您每次都必须显式地调用
BeginEdit
EndEdit
CancelEdit

如果您有Bindingsource,您可以对CurrentChanged事件调用EndEdit(),以中和CurrencyManager的BeginEdit()


这并不能避免每次换工作都要打电话给BeginEdit的费用。

谢谢你的帮助。我也在考虑用自己的接口替换IEditableObject。如果删除IEditableObject,我会失去WinForms提供的一些有用功能吗?据我所知,它主要用于网格。@Dmitry:它用于所有绑定场景。出于实际目的,由于网格通常是自动实现取消的唯一控件,因此唯一会丢失的是取消功能。