绑定到嵌套属性仅显示列表中的第一项 [英] Binding to nested property only showing first item in list

查看:83
本文介绍了绑定到嵌套属性仅显示列表中的第一项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将.NET 4.5中C#Winforms中的ListBox控件绑定到具有嵌套属性的对象列表,该属性希望用于DisplayMember.除了将DisplayMember设置为nested属性时,列表框仅显示一项,即使列表中有两项绑定到该列表项,它的工作方式也是如此.如果我注释掉用于设置DisplayMember的代码,则listBox将显示两个项目.这是框架中的错误吗?如果可以的话,我想避免添加其他属性或覆盖ToString(),因为我正在实现MVP,并且希望使视图逻辑与视图保持隔离.这是下面的一些示例代码.

I am trying to bind a ListBox Control in C# Winforms in .NET 4.5 to a list of objects that have a nested property that I wish to use for a DisplayMember. It sort of works except that when I set the DisplayMember to the nested property the listbox only shows one item even though there are two items in the list that it is bound to. If I comment out the code for setting the DisplayMember the listBox shows two items. Is this a bug in the framework? I would like to avoid adding another property or overriding ToString() if I can since I am implementing MVP and would like to keep my view logic isolated to my view. Here is some example code below.

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"仅显示SelectedItem-NestedItem.Name属性,如果SelectedItem,我对此进行了测试更改后,显示的名称也会相应更改-.最简单的解决方法是为DisplayMember添加另一个属性:

It seems that setting DisplayMember to "NestedItem.Name" only displaying NestedItem.Name property of SelectedItem -I tested this, if SelectedItem changed, the Name displayed also changed accordingly-. The easiest work around is to 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";

不雅致,但比在此处 更新:

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

Following is a quick test I did. Add a button to toggle listBox1's DisplayMember. Onclick event handler :

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

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

when DisplayMember set to "Number" you can choose any item in list -not necessarily the first item-, then click the button again. You'll see that SelectedItem's NestedItem.Name displayed.

这篇关于绑定到嵌套属性仅显示列表中的第一项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆