WinForms数据绑定-绑定到列表中的对象

7

我需要一些关于WinForms数据绑定的帮助/指导,但似乎谷歌无法为我提供帮助。

这是我的情况。考虑以下类,它类似于我所需的内容:

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

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

我的实例将是一个具有四个Tire对象的List的Car类对象。请注意,这里我总是知道列表中的对象数量。
现在我想将其数据绑定到包含五个文本框的表单上。其中一个文本框显示汽车名称,每个轮胎的压力都有一个文本框。
有什么办法让它工作?VS中的设计师似乎不允许我通过分配到列表索引(如Tires [0] .Pressure)来设置此项。
我目前的解决方案是绑定到一个“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”非常庞大!


你应该能够通过代码而不是设计师来绑定列表。这里有一个例子(来自几个小时前)。 - Beep beep
在我看来,你通过为Car类创建一个“视图”对象包装器并在UI中使用它来解决了问题。很可能,你有一个在UI中显示的汽车列表,因此你需要阅读CurrencyManager以了解如何帮助你的开发...这是10年前的事情了。 - B H
2个回答

18

请注意,您可以将控件绑定到实现IListICollectionIEnumerable接口或从实现这些接口的类继承的任何对象类型。 泛型集合也符合此类绑定。

这些内部转换为一个IBindingList实例。

查看以下链接以获取更多信息:

  1. Windows Forms数据绑定路线图 - 对实现和可能性进行了非常全面的介绍,并提供了各种其他KB文章的链接。
  2. Winforms对象绑定 - Rockford Lhotka关于该主题的文章。 提供一种面向Windows表单设计师的实现数据绑定的方法。
  3. 使用Windows Forms 2.0进行数据绑定 - Brian Noyes撰写的这本书探讨了数据绑定的各个方面,无论是在复杂还是简单的情况下。

一则注释。在第一个链接中,它说:“Windows Forms对象模型不支持绑定到IEnumerable接口,因为当你绑定到除简单对象之外的任何东西时,需要向后滚动支持。”。您说IEnumerable会自动转换为IBindingList - Frank Bryce

4
虽然WinForms设计器可能不允许您这样做,但您是否尝试在代码中设置绑定?我想绑定文本框到someCar.Tires[1].Pressure应该没有问题。

不,我没有尝试过,因为我认为由于设计师提示的信息,这是不支持的。我会尽快尝试一下。 - Geir-Tore Lindsve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接