绑定到仅显示列表中第一个项目的嵌套属性

我试图将.NET 4.5中的C#Winforms中的ListBox控件绑定到具有嵌套属性的对象列表,我希望将其用于DisplayMember。 除了当我将DisplayMember设置为嵌套属性时,列表框仅显示一个项目,即使列表中有两个项目被绑定,它也是有效的。 如果我注释掉用于设置DisplayMember的代码,则listBox显示两个项目。 这是框架中的错误吗? 我想避免添加另一个属性或覆盖ToString(),如果我可以,因为我正在实现MVP并且希望将我的视图逻辑保持在我的视图中。 以下是一些示例代码。

public partial class Form1 : Form { public Form1() { InitializeComponent(); var bindingSource = new BindingSource(); var listOfMyItems = new BindingList { new MyItem { Number = 1, NestedItem = new NestedItem { Name = "name1", Note = "note1" } }, new MyItem { Number = 2, NestedItem = new NestedItem { Name = "name2", Note = "note2" } }, }; bindingSource.DataSource = listOfMyItems; listBox1.DataSource = bindingSource; //comment out the line below and the listBox1 will show 2 items listBox1.DisplayMember = "NestedItem.Name"; } } public class NestedItem { public string Name { get; set; } public string Note { get; set; } } public class MyItem { public NestedItem NestedItem { get; set; } public int Number { get; set; } } 

似乎将DisplayMember设置为“NestedItem.Name”只显示NestedItem.Name属性 – 我测试了这个,如果SelectedItem更改,显示的名称也相应地更改 – 。 最简单的解决方法是为DisplayMember添加另一个属性 :

 public class MyItem { public NestedItem NestedItem { get; set; } public int Number { get; set; } public String NestedItemName { get { return NestedItem.Name; } } } 

然后设置DisplayMember

 listBox1.DisplayMember = "NestedItemName"; 

不优雅,但仍然比使用此处或此处建议的属性描述更容易。

更新:

以下是我做的快速测试。 添加一个按钮以切换listBox1's DisplayMemberOnclick事件处理程序:

 listBox1.DisplayMember = (listBox1.DisplayMember == "Number") ? "NestedItem.Name" : "Number"; 

DisplayMember设置为“Number”时,您可以选择列表中的任何项目 – 不一定是第一项 – ,然后再次单击该按钮。 您将看到SelectedItem's NestedItem.Name显示。