C# Winforms Bindingsource Datamember属性接口不显示任何内容

C# Winforms Bindingsource Datamember属性接口不显示任何内容,c#,.net,winforms,C#,.net,Winforms,设置: 使用一个属性初始化Model,该属性的类型是接口 创建实例并将其添加到winforms bindingsource 向winforms添加文本框,并将文本值配置为使用bindingsource和属性作为datamember 模型 装订 问题 当我运行此代码时,文本框保持为空(而不是显示客户的名称) 但当我将模型中Customer属性的类型更改为具体的Customer类型时,它确实显示了这一点 我在MSDN上找不到任何原因为什么会这样?有什么想法吗 (最好没有像将toString值存储

设置:

  • 使用一个属性初始化
    Model
    ,该属性的类型是接口
  • 创建实例并将其添加到winforms bindingsource
  • 向winforms添加文本框,并将文本值配置为使用bindingsource和属性作为datamember
模型

装订

问题

当我运行此代码时,文本框保持为空(而不是显示客户的名称)

但当我将模型中Customer属性的类型更改为具体的Customer类型时,它确实显示了这一点

我在MSDN上找不到任何原因为什么会这样?有什么想法吗


(最好没有像将toString值存储到另一个属性中这样的解决方法,有一个框架执行此绑定,我不想侵入)

可能您应该指定绑定到TextBox文本属性的属性

this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding
              ("Text", this.bsModel, "Customer.Name", true));
如果删除接口ICCustomer并直接使用具体类Customer,那么绑定代码将使用您在具体类中重写的始终存在的ToString()方法,从而获得文本框集。
例如,尝试更改ToString以返回一个姓氏属性

将属性设置为
false
将其修复,使其使用具体实现中的
ToString()
方法

this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bsModel, "Customer", false));
问题: 我刚刚浏览了msdn上的内容,突然发现了下面这行内容:

if (e.Value != null && (e.Value.GetType().IsSubclassOf(type) || e.Value.GetType() == type || e.Value is System.DBNull))
    return e.Value;
根据:

IsSubclassOf方法不能用于确定接口是否派生自另一个接口,或者类是否实现接口

因此,这将计算为
false
,进一步的转换将返回
null
。 通过设置为false,将不会调用parse方法,而只返回值

不确定这是故意的还是一个bug。但是我觉得对于具体类型,我最好将
formattingEnabled
设置为
false


@史蒂夫的解决方案也很有效!(谢谢) 但他正在研究接口类型


我只是更喜欢简单地使用
toString()
,因为它可以随着时间的推移而改变,而且维护起来更容易。

太好了,这对name很有用。但是当它是一个接口时,为什么不能使用toString方法呢。因为它是一个实例,所以toString总是在某个地方可用?(如果可能的话,我仍然更喜欢使用toString,因为它已经存在于所有要显示的类中)我找到了根本原因,尽管不确定它是否是故意的。无论如何,谢谢你。
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bsModel, "Customer", false));
if (e.Value != null && (e.Value.GetType().IsSubclassOf(type) || e.Value.GetType() == type || e.Value is System.DBNull))
    return e.Value;