我试图将.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.NameSelectedItem属性-我对此进行了测试,如果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";


虽然不优雅,但是比使用建议的herehere的属性描述符容易。

更新:

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

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


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

10-08 09:20