设定:
Model
,其中一个属性是接口。模型
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值存储到另一个属性中,有一个框架执行此绑定,我不想入侵)
答案 0 :(得分:2)
您可能应该指定应绑定到TextBox
的Text属性的属性this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding
("Text", this.bsModel, "Customer.Name", true));
如果删除接口ICustomer并直接使用具体类Customer,则绑定代码将使用您在具体类中重写的永远存在的ToString()方法,从而获得文本框集。 例如,尝试更改ToString以返回Surname属性
答案 1 :(得分:1)
将formattingEnabled
属性设置为false
进行修复,使其在具体实现中使用toString()
方法。
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bsModel, "Customer", false));
我刚浏览了msdn的source并碰到了以下一行:
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,将不会调用parse方法,而是简单地返回该值。
不确定它是否是故意的,或者是一个错误。但我觉得我最好还为具体类型设置formattingEnabled
到false
。
@Steve解决方案也正常运作! (谢谢) 但他正在研究界面类型。
我更喜欢简单地使用toString()
,因为它可以随着时间的推移而变化,而且维护起来也容易得多。