数据绑定到对象 - 如何取消数据源更改

Databinding to object - How to cancel datasource changes

场景如下: 我有一个带有 BindingSource 和一些数据绑定文本框的编辑对话框表单:

我将实体传递给表单构造函数并将其加载到 BindingSource.DataSource 中,这会导致数据绑定控件显示属性值。

问题是当用户编辑 TextBox 控件中的值并且传递 Validating 事件时,数据源会发生变化,尽管它不适用于数据库,但它仍然会让用户感到困惑当他在列表表单上看到编辑后的值时,直到下一次应用程序重新启动。

所以问题是:如何防止绑定源立即反映更改或如何回滚更改?

我继承了绑定源并创建了一个新的绑定源,如下所示:

public class SuperBindingSource:BindingSource
{
    #region Properties

    public object DataSourceBeforeChange { get; private set; }

    #endregion

    #region Methods

    public void ResetChanges()
    {
        this.DataSource = this.DataSourceBeforeChange;
    }

    #endregion

    protected override void OnDataSourceChanged(EventArgs e)
    {
        base.OnDataSourceChanged(e);

        DataSourceBeforeChange=this.DataSource.DeepClone();
    }
}

虽然我不确定这是否是一个好方法。

您可以在加载值后使用 SuspendBinding 方法。
之后,在您调用 ResumeBinding:

之前,这些值不应更新源

SuspendBinding and ResumeBinding are two methods that allow the temporary suspension and resumption of data binding in a simple-binding scenario. You would typically suspend data binding if the user must be allowed to make several edits to data fields before validation occurs. For example, if one field must be changed in accordance with a second, but where validating the first field would cause the second field to be in error.

根据文档,您应该可以将其与您的文本框一起使用。如果用户单击 Ok 保存值,您将恢复绑定,如果他取消,则不会。

作为一个选项,在设置数据绑定时,您可以将它们设置为从不更新数据源。

然后在你想要应用更改的时候,例如当按下 OK 按钮时,你可以设置数据绑定以在 属性 更改时更新数据源,然后调用结束编辑方法绑定源。

对于Cancel按钮,你不需要做任何事情,因为数据源没有更新。

例子

在表单加载事件中:

this.BindingContext[bindingSource].Bindings.Cast<Binding>().ToList()
    .ForEach(b=>b.DataSourceUpdateMode= DataSourceUpdateMode.Never);

当按下确定时:

this.BindingContext[productBindingSource].Bindings.Cast<Binding>().ToList()
    .ForEach(b => b.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged);
productBindingSource.EndEdit();

您可以download/clone完整的源代码: