我试图将.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; }
}
最佳答案
似乎将DisplayMember
设置为“ NestedItem.Name”仅显示NestedItem.Name
的SelectedItem
属性-我对此进行了测试,如果SelectedItem更改了,则显示的名称也会相应更改-。最简单的解决方法是add another property for 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";
虽然不优雅,但是比使用建议的here或here的属性描述符容易。
更新:
以下是我做的快速测试。添加一个按钮以切换
listBox1's DisplayMember
。 Onclick
事件处理程序:listBox1.DisplayMember = (listBox1.DisplayMember == "Number") ? "NestedItem.Name" : "Number";
当
DisplayMember
设置为“数字”时,您可以选择列表中的任何项目(不一定是第一项),然后再次单击该按钮。您会看到显示的SelectedItem's NestedItem.Name
。