ComboBox DataSource,项目为不同类型时的奇怪行为

时间:2019-03-14 13:24:57

标签: c# winforms data-binding combobox

组合框的项目基于元素类型为Dog的集合。

public class Dog {
    public String Name { set; get; }
    public String Breed { set; get; }
}

用法:

public partial class MyForm: Form
{
    private ArrayList dogs = new ArrayList();
    public Form5()
    {
        InitializeComponent();

        dogs.Add(new Dog() { Name = "Boby", Breed = "Pinscher" });
        dogs.Add(new Dog() { Name = "Sid", Breed = "Labrador" });

        comboBox1.DataSource = dogs;
        comboBox1.DisplayMember = "Name";
    }
}

现在,我想添加一个null元素,但是不想通过创建Dog类型的虚拟空对象来实现:有时候是不可能的。
由于DisplayMember是表示属性名称的字符串,在这种情况下为“名称”,因此我认为具有相同属性的其他类类型将起作用。
这样可以提供一个非常整洁的解决方案,例如:1)定义一个空对象(应该是一个单例对象,但是为了简洁起见,我将其保留为基本形式):

public class NullObject
{
    public String Name { get { return ""; } }
}

然后(2)将其添加到集合中:

dogs.Add(new NullObject());

这不起作用,我得到的是这样的组合:
combobox-example1

如果我将NullObject移到开头,请这样做:

dogs.Add(new NullObject());
dogs.Add(new Dog() { Name = "Boby", Breed = "Pinscher" });
dogs.Add(new Dog() { Name = "Sid", Breed = "Labrador" });

我会得到:
combobox-example2

因此,就好像WinForms缓存了第一个元素的对象类型,然后期望下面的对象类型是相同类型一样,否则回退到ToString()方法上(在可行的情况下,可能是 )。

这是错误还是在某处记录了?有没有另一种方法可以实现与ComboBox结合使用的空对象模式?

更新1:

ValueMember的行为似乎与最初预期的一样,即即使数据源集合中的对象类型不同,它也会寻找指定名称的属性。

0 个答案:

没有答案