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

时间:2013-12-28 01:30:09

标签: c# winforms data-binding listbox bindingsource

我正在尝试将.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; }
}

1 个答案:

答案 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

不优雅,但比使用建议herehere的属性描述更容易。

更新:

以下是我做的快速测试。添加按钮以切换listBox1.DisplayMember = "NestedItemName"; listBox1's DisplayMember事件处理程序:

Onclick

listBox1.DisplayMember = (listBox1.DisplayMember == "Number") ? "NestedItem.Name" : "Number"; 设置为“数字”时,您可以选择列表中的任何项目 - 不一定是第一项 - ,然后再次点击该按钮。您会看到显示DisplayMember