我正在尝试将.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<MyItem>
{
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; }
}
答案 0 :(得分:2)
似乎将DisplayMember
设置为“NestedItem.Name”仅显示NestedItem.Name
的{{1}}属性 - 我对此进行了测试,如果SelectedItem发生更改,则显示的名称也相应更改 - 最简单的解决方法是add another property for DisplayMember:
SelectedItem
然后设置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 DisplayMember
事件处理程序:
Onclick
当listBox1.DisplayMember = (listBox1.DisplayMember == "Number") ? "NestedItem.Name" : "Number";
设置为“数字”时,您可以选择列表中的任何项目 - 不一定是第一项 - ,然后再次点击该按钮。您会看到显示DisplayMember
。