3

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

预期: 调用 ValidateChildren 后,所有编辑的值都应该在我的数据对象中。

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

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

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

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

编辑 经过进一步调查,我尝试了这个并且它有效:

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

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

4

1 回答 1

1

我不确定这是否有帮助,或者它是否会是一个完整的答案,但我遇到了类似的问题,其中只有一个值被保存在整个表单中。这是我在 MS 网站上找到的一些背景说明:

http://connect.microsoft.com/VisualStudio/feedback/details/351146/binding-writevalue-does-not-update-underlying-data-source

即使 SuspendBinding 对我也不起作用。因此,按照链接和那里的信息,我通过 BindingSource 对象将对象连接起来,并将 RaiseListChangeEvents 属性设置为 False

Dim MyBindingSource = New BindingSource With {.DataSource = MyDataSource, .RaiseListChangedEvents = False}
MyControl.DataSource = MyBindingSource

一旦这到位,您可以调用控件上的绑定并手动写入值(假设只有一个绑定),代码将类似于:

MyControl.Bindings(0).WriteValue()

让我知道这是否有帮助。

于 2013-10-29T15:49:18.797 回答