数据绑定Windows窗体控件在失去焦点之前无法识别更改
我使用数据绑定在C#Windows窗体客户端的文本框中显示值。 当用户单击“保存”时,我会将更改保留到数据库中。 但是,将忽略活动编辑器中的新值(保存以前的值)。 如果我跳出活动编辑器,然后保存,则新值将保持不变,如预期的那样。
有没有办法在持久化之前强制主动控件接受其值?
如果可以获得与输入( TextBox
)对应的Binding
实例,则可以调用WriteValue
方法将控件中的值强制为绑定到的对象。
此外,您可以在BindingManagerBase
类 (通常是CurrencyManager
类实例)上调用EndCurrentEdit
方法来完成编辑,但这需要在绑定的对象上实现ICancelAddNew
或IEditableObject
接口(并且不需要您ICancelAddNew
为了绑定)。
我使用的解决方案是在实际保存数据库记录之前,从Save事件(调用)调用Form上的ValidateChildren
。 这会强制validation所有字段,从而进行绑定而不会丢失当前正在表单上编辑的控件的焦点。 如果保存按钮位于Windows菜单系统上而不是自身forms,则非常方便 – 如果表单上任何控件中的数据无效,则返回False,因此可用于防止保存错误数据。
这也解决了当OnPropertyChanged
用作绑定方法而不是OnValidation
时发生的绑定字段的不一致更新。 此外,如果将绑定方法设置为Never,并且对每个控件捕获的每个已validation事件进行单独的WriteValue调用,则至关重要。
这是一种黑客攻击,但在调用save之前,尝试将焦点从活动编辑器(通过将焦点设置为其他内容,例如保存按钮)设置在按钮事件中。