解除绑定绑定源

本文关键字:绑定 | 更新日期: 2023-09-27 18:00:45

我在windows窗体应用程序中使用绑定源来填充视图中的一些文本框等。绑定工作正常,但如何从我的对象中取消订阅我的bindingSource?

bindingSource.DataSource = new Foo();//OK
bindingSource.DataSource = null;//Not ok

如果我试图通过设置data = null来解除绑定,我会得到一个异常:

System.ArgumentException:无法绑定到属性或栏DataSource。参数名称:dataMember

我不想删除所有到控件的绑定(我有很多),但只要bindingSource没有数据,我就想挂起绑定。。。。

我找到了一个类似bindingSource.DataSource = typeof(Foo);的变通方法,但这就是方法吗?

解除绑定绑定源

typeof"变通办法";当您在PropertyGrid中设置BindingSource的DataSource并从";项目数据源";。

查看表单.的*.designer.cs文件中生成的代码

我们使用这个";技巧";在我们的一款产品中,多年来一直运行良好。

问候

我不知道BindingSource对象的.Data属性,但有一个.DataSource属性,可以设置为null:

bindingSource.DataSource = null;

这将从数据中释放绑定源。但是,查看BindingSource.DataSource:的参考

DataSource property             List results
----------------------------    -------------------------------------------
null with DataMember set        Not supported, raises ArgumentException.

如果您使用的是DataMember,则不能在没有异常的情况下将DataSource设置为null。

不幸的是,我不知道你的变通方法是否正确,但至少现在我们知道,当设置DataMember时,你不能简单地绑定到null。

mrlucmorin给了您正确的答案。它正在发挥作用,这是处理这种情况的正确方式。

但是,如果您的DataSource是DataTable类型,则它不会完全起作用。在这种情况下,您可能希望在取消BindingSource.DataSource之前使用bs.RaiseListChangedEvents = false;,并在分配新DataSource之后将其设置为true。在您将其设置为true之后,不要忘记使用bs.ResetBindings(true); 重置绑定

请注意,这可能会导致您的数据绑定控件中留下"旧"数据。

当使用typeof作为";"空";值,可以这样测试:

private void BindingSource_DataSourceChanged(object sender, EventArgs e)
{
    DataSource dataSource = ((BindingSource)sender).DataSource;
    if (dataSource is Type t && t == typeof(MyModel))
    {
        lblEmpty.Visible = true;
        pnlDetails.Visible = false;
    }
    else
    {
        lblEmpty.Visible = false;
        pnlDetails.Visible = true;
    }
}

通过这种方式,您可以有条件地隐藏或显示";"空";消息。