[英]Windows Forms Databinding DisplayMember a Custom Class's Child Property
我正在尝试将我的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来处理这个?
编辑:
我试图不修改这些类,因为它们是通过WSDL文档生成的。
不,大多数winforms绑定不支持这样的子属性。
您可以使用自定义类型描述符直接执行此操作,但这是很多工作而且不值得。
检查生成的代码; 它应该(使用最新版本的工具)是一个partial class
; 这意味着您可以在第二个类文件中添加额外的成员,因此您不会破坏wsdl生成的代码 - 即
namespace MyWsdlNamespace {
partial class MyClass {
public string InfoDescription {
get { return Info.Description; }
// and a set if you want
}
}
}
您现在应该可以非常轻松地绑定到“InfoDescription”。
您可以添加映射到Info.Description的新属性。
像这样的东西:
public string InfoDescription
{
get { return Info.Description; }
set { Info.Description = value; }
}
这会奏效。 但我认为你的榜样也应该有效
我知道可能对你有用的几个答案已经发布了,这个问题已经有3年了,但是我想添加另一个选项,因为在与Entity Framework中的对象进行数据绑定时遇到了这个问题。
我绑定到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
是的,绑定到嵌套属性可以通过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
的类型为Information<out P>
。
只需覆盖SecurityInfo ToString方法返回Description并执行:
lstSecurities.DisplayMember = "Info";
如果您无法修改类,最好的选择是使用ViewModel。 获取安全性并公开要查看的属性的类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.