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值存储到另一个属性中这样的变通方法,有一个框架可以进行绑定,我不想侵入其中)
您可能应该指定应该绑定到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()
,因为它可以随着时间的推移而变化,而且更容易维护。