WinForm UI数据绑定到视图模型,如何取消编辑放弃不需要的更改

时间:2012-12-23 23:40:55

标签: c# winforms data-binding

enter image description here

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

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

我的经历:我觉得我的理解不正确。在我编辑了一个文本字段后,只要我将焦点丢失到该文本框或组合框,就会以这样一种方式记住更改:如果我点击“取消”或[x]关闭按钮,则无关紧要。现在,当关闭此窗体时,该值将分配给内存中的ViewModel。 (当然,因为我没有点击“提交”,所以它没有通过所有的IO逻辑)

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

1 个答案:

答案 0 :(得分:2)

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

有关如何使用数据绑定实现取消的信息,请参阅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。或者有一个辅助方法来执行此操作,以便在其他表单上重用。