我正在尝试创建一个可重用的“设置”对话框,我想将对话框中的控件绑定到Visual Studio中内置的Properties.Settings。
这是我在迭代每个控件时使用的代码:
Control.DataBindings.Add(new Binding(strProperty, Properties.Settings.Default, Control.Name, false, DataSourceUpdateMode.Never));
将strProperty解析为要绑定的控件的相应属性。请注意更新模式:DataSourceUpdateMode.Never。更多关于这一点。
此代码用于将控件绑定到设置。对话框打开后,所有控件都会显示相应的值。问题在于使DataSource(即Properties.Settings)在正确的时间正确更新。当DataSourceUpdateMode设置为" OnPropertyChanged"时,它按预期工作以更新值,但这不是对话框的所需行为。在按下确定按钮之前,您不想更新,而不是在控件中的值发生更改后立即更新。 在阅读了我能找到的所有文档之后,在我看来,最好的方法是将DataSourceUpdateMode设置为" Never"然后当按下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按钮时,我遍历所有控件并将CausesValidation标志设置回true,然后调用表单的ValidateChildren()方法。这具有导致验证在所有控件之后发生的效果,并且仅在按下OK按钮之后但结果与我使用binding.WriteValue()时的结果完全相同。在第一个控件更新数据源后,表单上的每个其他绑定控件立即恢复为原始值。