【问题标题】:WinForm UI Data binding to View Model, How to Cancel Editing Discard Unwanted ChangesWinForm UI 数据绑定到视图模型,如何取消编辑丢弃不需要的更改
【发布时间】:2026-02-03 11:00:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# winforms data-binding


    【解决方案1】:

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

    请参阅this answer,了解如何使用数据绑定实现取消。您将暂停自动数据绑定更新,然后强制它们在 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
    

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

    【讨论】:

    • 感谢 Neo,圣诞快乐 :)