usercontrol上的设计和运行时绑定错误

时间:2017-03-24 10:41:36

标签: c# winforms binding windows-forms-designer

非常需要帮助解决Winform UserControls的奇怪绑定问题。

就是这样。

  • 拥有一个包含UserControl的表单
  • UserControl具有System.Windows.Forms.BindingSource控件
  • BindingSource在设计时将DataSource设置为实体POCO类型。
  • UserControl具有绑定到POCO类的属性的控件。示例: CreateDate

UserControl本身的设计者没问题。

但是输入设计器和包含UserControl的Form,我得到一个设计器错误窗口,其中包含以下消息:"无法绑定到DataSource上的属性或列CreateDate。参数名称:dataMember"

在运行时我得到相同的错误,但首先在窗体上调用Show时。在这里,我可以在堆栈跟踪中看到它在CheckBinding调用之后被抛出。

无论在创建(构造函数)或表单上的Load事件期间是否设置了bindingSource上的DataSource,都会发生错误。

我可以看到设计器在设计器文件中设置了我的数据源: this.bindingSourceRecipe.DataSource = typeof(Data.Entities.Recipe);

我已经尝试了很多东西来解决这个问题。这似乎很奇怪,因为这是一个简单的死形式/控件设置,应该是Winforms用户控件的一个简单的用法。

如果我在运行时将bindingSourceRecipe.DataSource设置为temp。在表单中的InitializeComponent()之后的实例,然后没有错误发生;

InitializeComponent();
ucRecipeBaseControl.Recipe = new Recipe() { Id = 0, CreateDate = DateTime.Now, Name = "" };

所以似乎表单/控件的初始化周期以某种方式清除了关于其DataSource类型的绑定源知识。

如果一个地方所有用户控件和BindingSource直接在表单上,​​这当然不会发生。然后,每个事都可以工作,并且DataSource是否被设置为数据实体的实例并不重要。

对我来说似乎是一个完全的谜,应该是死的简单,我有点迷失在做什么。

非常感谢任何帮助或建议。

BR Peter Meldgaard

1 个答案:

答案 0 :(得分:2)

啊,啊,最后把它钉了起来。它是由Winform设计器行为和我的代码混合引起的。我在公共属性设置器中设置绑定控件数据源,因此我可以保存实体的副本,以便能够比较更改的和组织。问题是,当您在窗体上放置具有公共属性的控件时,设计器会在设计器生成的代码中将此属性初始化为null。我不知道。因此,每次实例化usercontrol时,DataSource都设置为null,清除typeof(dataentity),尽管丢失了绑定信息。

在setter中添加null检查,并且只在value不为null时更新数据源修复了问题。