我正在尝试将 .NET 4.5 中的 C# Winforms 中的 ListBox 控件绑定到具有我希望用于 DisplayMember 的嵌套属性的对象列表。它有点有效,除了当我将 DisplayMember 设置为嵌套属性时,列表框仅显示一项,即使列表中有两项它绑定到。如果我注释掉用于设置 DisplayMember 的代码,列表框将显示两个项目。这是框架中的错误吗?如果可以的话,我希望避免添加另一个属性或覆盖 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改变,显示的Name也会相应改变-.最简单的解决方法是为 DisplayMember 添加另一个属性 https://stackoverflow.com/a/440808/2998271 :
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 https://stackoverflow.com/a/4217317/2998271 or here https://stackoverflow.com/a/4273975/2998271.
UPDATE :
以下是我所做的快速测试。添加一个按钮来切换listBox1's DisplayMember
. Onclick
事件处理程序:
listBox1.DisplayMember = (listBox1.DisplayMember == "Number") ? "NestedItem.Name" : "Number";
when DisplayMember
设置为“数字”,您可以选择列表中的任何项目 -不一定是第一项-,然后再次单击该按钮。你会看到SelectedItem's NestedItem.Name
显示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)