2009-03-02 68 views
7

我需要一些关于WinForms数据绑定的帮助/指导,我似乎无法让Google帮助我解决这个问题。WinForms数据绑定 - 绑定到列表中的对象

这是我的场景。考虑下面的类,它类似于我所需要的:

public class Car 
{ 
    public string Name { get; set; } 
    public List<Tire> Tires { get; set; } 
} 

public class Tire 
{ 
    public double Pressure { get; set; } 
} 

我的这种情况下,将是汽车类的一个对象,具有四个轮胎对象名单。请注意,我将在此列表中始终有一个已知数量的对象。

现在我想将数据绑定到包含五个文本框的表单。一个带有汽车名称的文本框和一个带有每个轮胎压力的文本框。

关于如何使这项工作的任何想法? VS中的设计师似乎不允许我通过分配像轮胎[0],压力这样的列表索引来设置它。

我目前的解决方案是绑定到“BindableCar”这将是这样的:

public class BindableCar 
{ 
    private Car _car; 

    public BindableCar(Car car) 
    { 
     _car = car; 
    } 

    public string Name 
    { 
     get { return _car.Name; } 
     set { _car.Name = value; } 
    } 

    public double Tire1Pressure 
    { 
     get { return _car.Tires[0].Pressure; } 
     set { _car.Tires[0].Pressure = value; } 
    } 

    public double Tire2Pressure 
    { 
     get { return _car.Tires[1].Pressure; } 
     set { _car.Tires[1].Pressure = value; } 
    } 

    public double Tire3Pressure 
    { 
     get { return _car.Tires[2].Pressure; } 
     set { _car.Tires[2].Pressure = value; } 
    } 

    public double Tire4Pressure 
    { 
     get { return _car.Tires[3].Pressure; } 
     set { _car.Tires[3].Pressure = value; } 
    } 
} 

但是当我的列表中包含的20,而不是4个对象这变得很丑陋,并为每个我想这些对象的绑定6个属性。这使得一个巨大的“BindableObject”!

回答

3

虽然WinForms设计器可能不会让你这样做,你有没有尝试在代码中设置绑定?我想有没有问题绑定一个文本框someCar.Tires [1]。压力。

+0

不,我没有,因为我认为这是不支持由于设计师提示的消息。我会尽快尝试。 – 2009-03-02 12:12:59

-1

您应该能够通过代码而不是设计器绑定到列表。这是一个example(从几个小时前)。

17

你应该注意,您可以将控件绑定到实现该接口IListICollectionIEnumerable或实现这些接口的类继承任何对象类型。泛型集合也适用于这种绑定。

这些内部转换为IBindingList实例。

退房有关更多信息,以下链接:

  1. Roadmap for Windowsforms databinding - 注意到在实施和可能性非常全面的外观,并提供了多种链接到其他知识库文章。
  2. Winforms Object binding - 罗克福德Lhotka的关于这个问题的文章。提供了一种实现数据绑定的Windows窗体设计器导向的方式。
  3. Databinding with Windows forms 2.0 - Brian Noyes撰写的这本书探讨了数据绑定的各个方面,包括复杂和简单的情况。
+0

感谢您的好链接! – 2009-03-02 12:14:13