C# 如何使用“确定”和“取消”按钮进行数据绑定

C# 如何使用“确定”和“取消”按钮进行数据绑定,c#,data-binding,C#,Data Binding,我正在尝试创建一个可重用的设置对话框,并希望将对话框中的控件绑定到Visual Studio中内置的Properties.Settings 这是我在遍历每个控件时用于绑定它们的代码: Control.DataBindings.Add(new Binding(strProperty, Properties.Settings.Default, Control.Name, false, DataSourceUpdateMode.Never)); 其中strProperty解析为要绑定的控件的相应属

我正在尝试创建一个可重用的设置对话框,并希望将对话框中的控件绑定到Visual Studio中内置的Properties.Settings

这是我在遍历每个控件时用于绑定它们的代码:

Control.DataBindings.Add(new Binding(strProperty, Properties.Settings.Default, Control.Name, false, DataSourceUpdateMode.Never)); 
其中strProperty解析为要绑定的控件的相应属性。注意更新模式:DataSourceUpdateMode.Never。一分钟后再谈

此代码用于将控件绑定到设置。对话框打开时,所有控件都显示相应的值。问题在于如何在正确的时间正确更新数据源,即Properties.Settings。当DataSourceUpdateMode设置为“OnPropertyChanged”时,它会按照预期的方式更新值,但这不是对话框所需的行为。在按下“确定”按钮之前,您不希望更新,而不是在控件中的值更改后立即更新。 在阅读了我能找到的所有文档之后,我觉得最好的方法是将DataSourceUpdateMode设置为“从不”,然后当按下OK按钮时,我将遍历所有控件并调用Control.DataBinding[0].WriteValue()手动更新所有属性。但是当我这样做的时候,我发现在第一个控件被更新之后,剩下的每个控件都会立即恢复到它以前的值

public void UpdateDataSource(Control.ControlCollection ctrls)
{
    foreach (Control ctrl in ctrls)
    {
        if (ctrl.Controls.Count > 0)
        {
             UpdateDataSource(ctrl.Controls);
        }

        if (ctrl.DataBindings != null)
        {
             foreach (Binding binding in ctrl.DataBindings)
             {
                 binding.WriteValue();
             }
        }
    }
}
我还尝试了使用DataSourceUpdateMode.OnValidation标志的方法。我将每个控件的CausesValidation属性设置为false,以防止在按下OK按钮之前发生更新。然后,当按下OK按钮时,我遍历所有控件并将CausesValidation标志设置回true,然后调用表单的ValidateChildren()方法。这会产生预期的效果,即在之后,并且仅在按下OK按钮之后,在所有控件上进行验证,但结果与我使用binding.WriteValue()时完全相同。在第一个控件更新数据源之后,表单上的每个其他绑定控件都会立即恢复为其原始值