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

C# WinForm UI数据绑定到视图模型,如何取消编辑放弃不需要的更改,c#,winforms,data-binding,C#,Winforms,Data Binding,我的提交表单通过bindingSource1绑定到提交视图模型 我所期望的:编辑时,我不希望将UI值指定给ViewModel。 我希望只有在点击“提交”按钮并验证UI值之后,才将值分配给ViewModel,然后我将调用bindingSource.EndEdit()。只有到那时,UI值才应该写入ViewModel 我的经历:我发现我的理解是错误的。编辑一个文本字段后,当我对该文本框或组合框失去焦点时,所做的更改将以这样的方式被记住,无论我是否点击“取消”或[x]关闭按钮。该值现在在关闭此窗体时分配

我的提交表单通过bindingSource1绑定到提交视图模型

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

我的经历:我发现我的理解是错误的。编辑一个文本字段后,当我对该文本框或组合框失去焦点时,所做的更改将以这样的方式被记住,无论我是否点击“取消”或[x]关闭按钮。该值现在在关闭此窗体时分配到内存中的ViewModel中。(当然,因为我没有点击“提交”,所以它没有通过所有IO逻辑)


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

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

有关如何使用数据绑定实现取消,请参见。您将挂起自动数据绑定更新,然后在
Submit
上强制手动完成这些更新

或者,您可以在控件上设置
CausesValidation=False
。然后,让
取消
按钮关闭您的表单,然后您的
提交
执行类似的操作:

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

如果您决定使用上述方法进行生产使用,请通过控件枚举一次(例如,在
表单加载
)并收集数据绑定的控件。然后,您可以轻松地在循环中运行它们,并将
CausesValidation
设置为
True
False
。或者有一个帮助器方法来实现这一点,以便在其他表单上重复使用。

谢谢Neo和merry圣诞节:)