我正在尝试将我的ListBox在Windows窗体项目中的DisplayMember属性设置为我绑定到的通用列表中的嵌套类的属性。
这是一个简单的例子:
public class Security
{
public int SecurityId { get; set;}
public SecurityInfo Info { get; set;}
}
public class SecurityInfo
{
public string Description { get; set;}
}
//........//
public void DoIt()
{
List<Security> securities = new List<Security>();
//add securities to list
lstSecurities.DataSource = securities;
lstSecurities.DisplayMember = "Info.Description";
}
这可以通过一个简单的ListBox实现,还是我必须创建一个子类ListBox来处理它?</ p>
编辑:
我试图不修改这些类,因为它们是通过WSDL文档生成的。
答案 0 :(得分:5)
不,大多数winforms绑定都不支持这样的子属性。
你可以直接使用自定义类型描述符来完成它,但这是很多的工作而且不值得。
检查生成的代码;它应该(使用任何最新版本的工具)是partial class
;这意味着你可以在第二个类文件中添加额外的成员,这样你就不会破坏wsdl生成的代码 - 即。
namespace MyWsdlNamespace {
partial class MyClass {
public string InfoDescription {
get { return Info.Description; }
// and a set if you want
}
}
}
您现在应该可以非常轻松地绑定到“InfoDescription”。
答案 1 :(得分:2)
您可以添加一个映射到Info.Description的新属性。
这样的事情:
public string InfoDescription
{
get { return Info.Description; }
set { Info.Description = value; }
}
这会奏效。但我认为你的例子也应该有用
答案 2 :(得分:1)
我知道可能适用于你的几个答案已经发布了,这个问题已经有3年了,但是我想添加另一个选项,因为我在实体框架中与对象进行数据绑定时遇到了这个问题。 / p>
我绑定了一个ListBox,但想显示来自子对象的文本。我所做的只是处理ListBox.Format
事件,并更改ListControlConvertEventArgs.Value
。我可以获取我的子对象,因为我为ListBox选择的DisplayMember是父对象本身,并且可以通过ListControlConvertEventArgs.ListItem
在事件中访问它。
例如,ListBox被数据绑定到具有objA列表的绑定源。 objA具有子对象objB的属性。 ListBox的DisplayMember(在设计时设置)是objB。但是,由于ToString()
方法没有返回我想要的objB,我处理ListBox的Format事件并设置e.Value
(e
为ListControlConvertEventArgs
})我正在寻找的对象:
CType(e.ListItem, objA).objB.DisplayText
答案 3 :(得分:0)
只需覆盖SecurityInfo ToString方法即可返回Description并执行:
lstSecurities.DisplayMember = "Info";
如果您无法修改类,最好的选择是使用ViewModel。获取安全性并公开要查看的属性的类。
答案 4 :(得分:0)
答案 5 :(得分:0)
是的,绑定到嵌套属性可以通过BindingSource完成。 Dan在1月25日发表的评论显示了如何通过“简单绑定”来实现这一点,即绑定到单个obejct的嵌套属性。对于集合的“复杂绑定”,它应该是这样的:
public void DoIt()
{
List<Security> securities = new List<Security>();
var securitiesBindingSource = new BindingSource();
securitiesBindingSource.DataSource = securities;
//add securities to list
lstSecurities.DataSource = securitiesBindingSource;
lstSecurities.DisplayMember = "Info.Description";
}
微妙的警告:集合的对象应该是相同类型的后代,因此Info应该是相同的类型。当Info属性依赖于类型参数时,接口协方差不会欺骗它工作,即使它是协变的,因为这将使Info成为协变但不同的类型,例如,当Info
的类型为{{1}时}}