Winforms Bindingsource Datamember属性界面不显示任何内容

时间:2015-12-29 16:36:27

标签: c# .net winforms

  

设定:

  • Model,其中一个属性是接口。
  • 创建实例并将其添加到winforms bindingsource
  • 为winforms添加文本框并配置文本值以将bindingsource与属性用作datamember
  

模型

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值存储到另一个属性中,有一个框架执行此绑定,我不想入侵)

2 个答案:

答案 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方法,而是简单地返回该值。

不确定它是否是故意的,或者是一个错误。但我觉得我最好还为具体类型设置formattingEnabledfalse

@Steve解决方案也正常运作! (谢谢) 但他正在研究界面类型。

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