组合框的项目基于元素类型为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());
如果我将NullObject移到开头,请这样做:
dogs.Add(new NullObject());
dogs.Add(new Dog() { Name = "Boby", Breed = "Pinscher" });
dogs.Add(new Dog() { Name = "Sid", Breed = "Labrador" });
因此,就好像WinForms缓存了第一个元素的对象类型,然后期望下面的对象类型是相同类型一样,否则回退到ToString()方法上(在可行的情况下,
这是错误还是在某处记录了?有没有另一种方法可以实现与ComboBox结合使用的空对象模式?
ValueMember
的行为似乎与最初预期的一样,即即使数据源集合中的对象类型不同,它也会寻找指定名称的属性。