数据绑定Windows窗体控件在失去焦点之前无法识别更改

我使用数据绑定在C#Windows窗体客户端的文本框中显示值。 当用户单击“保存”时,我会将更改保留到数据库中。 但是,将忽略活动编辑器中的新值(保存以前的值)。 如果我跳出活动编辑器,然后保存,则新值将保持不变,如预期的那样。

有没有办法在持久化之前强制主动控件接受其值?

如果可以获得与输入( TextBox )对应的Binding实例,则可以调用WriteValue方法将控件中的值强制为绑定到的对象。

此外,您可以在BindingManagerBase类 (通常是CurrencyManager类实例)上调用EndCurrentEdit方法来完成编辑,但这需要在绑定的对象上实现ICancelAddNewIEditableObject接口(并且不需要您ICancelAddNew为了绑定)。

我使用的解决方案是在实际保存数据库记录之前,从Save事件(调用)调用Form上的ValidateChildren 。 这会强制validation所有字段,从而进行绑定而不会丢失当前正在表单上编辑的控件的焦点。 如果保存按钮位于Windows菜单系统上而不是自身forms,则非常方便 – 如果表单上任何控件中的数据无效,则返回False,因此可用于防止保存错误数据。

这也解决了当OnPropertyChanged用作绑定方法而不是OnValidation时发生的绑定字段的不一致更新。 此外,如果将绑定方法设置为Never,并且对每个控件捕获的每个已validation事件进行单独的WriteValue调用,则至关重要。

这是一种黑客攻击,但在调用save之前,尝试将焦点从活动编辑器(通过将焦点设置为其他内容,例如保存按钮)设置在按钮事件中。