C# 验证绑定到同一对象的不同属性的控件将重置ObjectValue

C# 验证绑定到同一对象的不同属性的控件将重置ObjectValue,c#,winforms,validation,data-binding,.net-4.0,C#,Winforms,Validation,Data Binding,.net 4.0,我有一个表单,在该表单上,所有文本框都绑定到实现INotifyPropertyChanged的同一个数据对象的不同属性。表单自动验证设置为“禁用”,因为我想通过调用表单.ValidateChildren()显式触发验证 期望值: 调用ValidateChildren后,所有编辑的值都应该在my dataobject中 问题: 只有最后一个焦点控件将其数据写入dataobject,但所有其他控件都会丢失已编辑的值并显示旧值 问题: 如何确保在控件刷新自身之前验证所有数据 使用Autovalidat

我有一个表单,在该表单上,所有文本框都绑定到实现INotifyPropertyChanged的同一个数据对象的不同属性。表单自动验证设置为“禁用”,因为我想通过调用表单.ValidateChildren()显式触发验证

期望值: 调用ValidateChildren后,所有编辑的值都应该在my dataobject中

问题: 只有最后一个焦点控件将其数据写入dataobject,但所有其他控件都会丢失已编辑的值并显示旧值

问题: 如何确保在控件刷新自身之前验证所有数据

使用Autovalidate=EnablePreventFocusChange或EnableAllowFocusChange确实有效,但由于我想一次验证所有内容,因此这对我来说不是一个可接受的解决方案

在互联网上搜索答案时,我发现一个显示了相同的问题,但不幸的是没有解决方案

编辑 经过进一步调查后,我尝试了这个方法,效果很好:

form.BindingContext[dataobject].SuspendBinding();
form.ValidateChildren();
form.BindingContext[dataobject].ResumeBinding();

暂停绑定是标准方法还是有更好的解决方案来解决这个问题?

我不确定这是否有用,或者这是否是一个完整的答案,但我遇到了类似的问题,即整个表单中只保存了一个值。以下是我在微软网站上找到的一些背景说明:

甚至SuspendBinding对我也不起作用。因此,在链接和信息之后,我通过BindingSource对象将对象连接起来,RaiseListChangeEvents属性设置为False

Dim MyBindingSource = New BindingSource With {.DataSource = MyDataSource, .RaiseListChangedEvents = False}
MyControl.DataSource = MyBindingSource
这一点到位后,您可以调用引用控件上的绑定并手动写入值(假设只有一个绑定),代码将类似于:

MyControl.Bindings(0).WriteValue()

如果有帮助,请告诉我。

你好,pkoszka,谢谢你的回答。我在一年前就遇到了这个问题,最后我在没有数据绑定的情况下重新设计了表单,所以我不能说你的建议是否对我有效,对不起。这将解决问题。