2009-03-02 33 views
7

Tôi cần một số trợ giúp/hướng dẫn về ràng buộc dữ liệu WinForms và tôi dường như không thể giúp Google giúp tôi.Ràng buộc dữ liệu WinForms - Liên kết với các đối tượng trong danh sách

Đây là kịch bản của tôi. Hãy xem xét các lớp học sau đây tương tự như những gì tôi cần:

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

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

Trường hợp của tôi về điều này sẽ là đối tượng của lớp Xe với Danh sách có bốn Vật thể lốp. Lưu ý rằng tôi sẽ luôn có một số đối tượng đã biết trong danh sách ở đây.

Bây giờ tôi muốn dữ liệu ràng buộc điều này với Biểu mẫu chứa năm hộp văn bản. Một hộp văn bản với tên của chiếc xe và một hộp văn bản với mỗi áp lực lốp xe.

Bất kỳ ý tưởng nào về cách thực hiện công việc này? Các nhà thiết kế trong VS dường như không cho phép tôi thiết lập điều này bằng cách gán cho danh sách các chỉ mục như Lốp xe [0] .Pressure.

giải pháp hiện tại của tôi là để ràng buộc vào một "BindableCar" mà sẽ như thế nào:

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; } 
    } 
} 

nhưng điều này trở nên thực sự xấu xí khi danh sách của tôi chứa 20 thay vì 4 đối tượng, và cho mỗi người trong số các đối tượng tôi muốn để ràng buộc với 6 thuộc tính. Điều đó làm cho một "BindableObject" rất lớn!

Trả lời

3

Trong khi trình thiết kế WinForms có thể không cho phép bạn thực hiện việc này, bạn đã thử thiết lập ràng buộc trong mã chưa? Tôi tưởng tượng không có vấn đề ràng buộc một textbox để someCar.Tires [1] .Pressure.

+0

Không, tôi không giả định rằng điều này không được hỗ trợ do thông báo do nhà thiết kế nhắc. Tôi sẽ thử điều này càng sớm càng tốt. –

-1

Bạn sẽ có thể liên kết với danh sách qua mã thay vì nhà thiết kế. Đây là số example (chỉ từ vài giờ trước).

17

Bạn nên lưu ý rằng bạn có thể ràng buộc các điều khiển để bất kỳ loại đối tượng mà thực hiện các giao diện IList, ICollection hoặc IEnumerable hoặc kế thừa từ các lớp học mà thực hiện các giao diện. Các bộ sưu tập chung cũng đủ điều kiện cho loại ràng buộc này.

Đây là nội bộ được chuyển đổi thành phiên bản IBindingList.

Kiểm tra các liên kết sau để biết thêm thông tin:

  1. Roadmap for Windowsforms databinding - Mất một cái nhìn rất toàn diện ở việc thực hiện và khả năng và cung cấp một loạt các liên kết đến bài viết KB khác.
  2. Winforms Object binding - Bài viết của Rockford Lhotka về chủ đề này. Cung cấp cách định dạng thiết kế Windows theo định hướng thực hiện databinding.
  3. Databinding with Windows forms 2.0 - Cuốn sách này của Brian Noyes khám phá các khía cạnh khác nhau của Databinding, cả trong các tình huống phức tạp và đơn giản.
+0

Cảm ơn các liên kết tuyệt vời! –

+0

Niềm vui của tôi! ;-) – Cerebrus

+0

Một lưu ý. Trong liên kết đầu tiên, nó nói rằng "... Windows Forms mô hình đối tượng không hỗ trợ ràng buộc với ...' IEnumerable' giao diện vì hỗ trợ di chuyển lạc hậu là cần thiết khi bạn liên kết với bất cứ điều gì khác hơn là một đối tượng đơn giản. " Bạn nói rằng 'IEnumerable' sẽ tự động được chuyển thành' IBindingList'. –

Các vấn đề liên quan