繁体   English   中英

Windows窗体数据绑定DisplayMember自定义类的子属性

[英]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.ValueeListControlConvertEventArgs )设置为我正在寻找的对象:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM