我有一个表单,所有文本框都绑定到实现INotifyPropertyChanged的相同数据对象的不同属性。表单 Autovalidate 设置为'禁用',因为我想通过调用 form.ValidateChildren()显式触发验证。
预期: 在调用ValidateChildren之后,所有编辑的值都应该在我的数据对象中。
问题: 只有最后一个聚焦控件将其数据写入数据对象,但所有其他控件都会丢失已编辑的值并显示旧值。
问题: 如何在控件刷新之前确保所有数据都已经过验证?
使用Autovalidate = EnablePreventFocusChange或EnableAllowFocusChange确实有效,但因为我想立即验证所有这些对我来说不是一个可接受的解决方案。
在互联网上搜索我发现 example 显示同样的问题,但遗憾的是没有解决方案。
修改 经过进一步调查后,我尝试了这个并且有效:
form.BindingContext[dataobject].SuspendBinding();
form.ValidateChildren();
form.BindingContext[dataobject].ResumeBinding();
以标准方式暂停绑定还是有更好的解决方案来解决这个问题?
答案 0 :(得分:1)
我不确定这是否有用,或者它是否是一个完整的答案,但我遇到类似的问题,其中只有一个值已从整个表格中保存。以下是我在MS网站上发现的一些背景说明:
即使是SuspendBinding对我也不起作用。因此,根据链接和信息,我通过BindingSource对象连接对象,并将RaiseListChangeEvents属性设置为False
Dim MyBindingSource = New BindingSource With {.DataSource = MyDataSource, .RaiseListChangedEvents = False}
MyControl.DataSource = MyBindingSource
一旦这就到位,你可以调用引用控件上的绑定并手动写入值(假设只有一个绑定)代码看起来类似于:
MyControl.Bindings(0).WriteValue()
如果有帮助,请告诉我。