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

本文关键字:显示 任何内 接口 Bindingsource Datamember 属性 Winforms | 更新日期: 2023-09-27 18:28:20

设置:

  • Model,该类具有一个类型为接口的属性
  • 创建一个实例并将其添加到winforms绑定源
  • 向winforms添加一个文本框,并将文本值配置为将具有该属性的bindingsource用作数据成员

型号

public class Model
{
    public ICustomer Customer { get; set; }
}
public class Customer : ICustomer
{
    public string Name { get; set; }
    public override string ToString()
    {
        return Name;
    }
}
public interface ICustomer
{
    string Name { get; set; }
}

绑定

this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bsModel, "Customer", true));

问题

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

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

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

(最好没有像将toString值存储到另一个属性中这样的变通方法,有一个框架可以进行绑定,我不想侵入其中)

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

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

this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding
              ("Text", this.bsModel, "Customer.Name", true));

如果删除接口ICustomer并直接使用具体类Customer,那么绑定代码将使用在具体类中重写的始终存在的ToString()方法,从而获得文本框集
例如,尝试更改ToString以返回姓氏属性

formattingEnabled属性设置为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;

根据MSDN:

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

因此,这将计算为false,并且进一步的转换将最终返回null。通过将formattingEnabled设置为false,将不会调用解析方法,而是简单地返回值。

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


@Steve的解决方案也在起作用!(谢谢)但他正在围绕接口类型工作。

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