3

在此处输入图像描述

我的提交表单通过 bindingSource1 绑定到提交 ViewModel。

我的期望:编辑时,我不希望将 UI 值分配给 ViewModel。我希望仅在点击“提交”按钮后将值分配给 ViewModel,并且验证 UI 值,然后我将调用bindingSource.EndEdit();. 只有到那时,UI 值才应该写入 ViewModel。

我的经历:我发现我的理解不正确。在我编辑了一个文本字段后,一旦我失去了对该文本框或组合框的关注,更改就会以这样的方式被记住,无论我点击“取消”还是 [x] 关闭按钮都无关紧要。现在,当此 Form 关闭时,该值已分配到内存中的 ViewModel。(当然,因为我没有点击“提交”,所以没有走完所有的IO逻辑)

当我“取消”/[x] 关闭我的编辑时,我希望 bindingSource 丢弃不需要的更改。我该怎么做?

4

1 回答 1

2

默认情况下,数据绑定会在验证事件上更新底层数据源。默认情况下,当您离开控件时会发生验证事件。但是,这两种行为都可以自定义。

有关如何使用数据绑定实现取消的信息,请参阅此答案。您将暂停自动数据绑定更新,然后强制它们在Submit.

作为替代方案,您可以CausesValidation = False在控件上进行设置。然后,让Cancel按钮关闭您的表单,然后Submit执行类似于此的操作:

control1.CausesValidation = True
control2.CausesValidation = True
control3.CausesValidation = True
Me.ValidateChildren()
control1.CausesValidation = False
control2.CausesValidation = False
control3.CausesValidation = False

如果您决定将上述方法用于生产用途,请枚举一次您的控件(例如 inside Form_Load),然后收集那些数据绑定的控件。然后,您可以轻松地循环运行它们并设置CausesValidationTrueFalse。或者有一个辅助方法来执行此操作,以便在其他表单上重用。

于 2012-12-24T02:21:51.803 回答