如何将 C# 7.0 元组类型值的集合绑定到 System.Windows.Forms.Listbox 并将显示成员设置为元素之一?

How can I bind a collection of C# 7.0 tuple type values to a System.Windows.Forms.Listbox and set the display member to one of the elements?

我有一个 System.Windows.Forms.Listbox 和一个我创建的元组类型值的集合。即the new tuple type introduced in C# 7.0。我正在尝试将集合绑定到 Listbox 并将 DisplayMember 设置为元组中的元素之一。这是一个例子:

var l = new List<(string name, int ID)>()
{
    ("Bob", 1),
    ("Mary", 2),
    ("Beth", 3)
};

listBox1.DataSource = l;
listBox1.DisplayMember = "name";

不过这行不通。使用旧式 Tuple<T> 你应该可以做所描述的 :

listBox1.DisplayMember = "Item1";
listBox1.ValueMember = "Item3";   // optional

这也不行。这是我在这两种情况下看到的:

我怎样才能做到这一点?

不幸的是,C#7 值元组不能用于数据绑定,因为它们使用 fields,而 Windows Forms 标准数据绑定仅适用于 properties .

伊万的回答,绝对是个案。作为解决方法,您可以使用 ListBoxFormat 事件来显示 name 归档:

private void listBox1_Format(object sender, ListControlConvertEventArgs e)
{
    e.Value = (((string name, int ID))e.ListItem).name;
}