Danh sách <T> so với BindingList <T> Ưu điểm / Nhược điểm


91

Ai đó có thể mô tả sự khác biệt giữa hai là gì cho dự án của tôi.

Hiện tại tôi có một List<MyClass>và đặt BindingSource thành đó và một DataGridView thành BindingSource.

Tôi đã triển khai IEditableObjectvì vậy khi CancelEdit được gọi, tôi hoàn nguyên đối tượng của mình trở lại như cũ vớiMemberwise.Clone()

Liệu việc thay đổi Danh sách của tôi thành BindingList có giải quyết được vấn đề này không và những lợi ích của việc sử dụng BindingList là gì?

Câu trả lời:


123

A List<>chỉ đơn giản là một mảng tự động thay đổi kích thước, gồm các mục của một kiểu nhất định, với một vài hàm trợ giúp (ví dụ: sắp xếp). Đó chỉ là dữ liệu và bạn có thể sử dụng nó để chạy các hoạt động trên một tập hợp các đối tượng trong mô hình của mình.

A BindingList<>là một trình bao bọc xung quanh một danh sách đã nhập hoặc một tập hợp, thực thi IBindingListgiao diện. Đây là một trong những giao diện tiêu chuẩn hỗ trợ kết hợp dữ liệu hai chiều. Nó hoạt động bằng cách triển khai ListChangedsự kiện, sự kiện này sẽ được nâng lên khi bạn thêm, xóa hoặc đặt các mục. Các điều khiển liên kết lắng nghe sự kiện này để biết khi nào cần làm mới màn hình của chúng.

Khi bạn đặt DataSource của BindingSource thành a List<>, nội bộ nó sẽ tạo một BindingList<>để bao bọc danh sách của bạn. Bạn có thể muốn BindingList<>tự mình gói trước danh sách của mình nếu bạn muốn truy cập nó bên ngoài BindingSource, nhưng nếu không thì nó giống nhau. Bạn cũng có thể kế thừa từ BindingList<>để thực hiện hành vi đặc biệt khi thay đổi các mục.

IEditableObjectđược xử lý bởi BindingSource. Nó sẽ gọi BeginEdit trên bất kỳ đối tượng triển khai nào khi bạn thay đổi dữ liệu trong bất kỳ điều khiển ràng buộc nào. Sau đó, bạn có thể gọi EndEdit / CancelEdit trên BindingSource và nó sẽ chuyển nó đến đối tượng của bạn. Di chuyển đến một hàng khác cũng sẽ gọi EndEdit.


Hiện tại với cách tiếp cận Danh sách <T> của tôi, việc gọi CancelEdit sẽ không trả lại mục đang được chỉnh sửa về trạng thái ban đầu, do đó tại sao tôi sử dụng Clone (). Bạn đang nói một danh sách ràng buộc sẽ xử lý điều đó cho tôi?
Jon

3
Không, BindingList không liên quan gì đến chức năng đó. BindingSource chỉ đơn giản gọi CancelEdit trên đối tượng hiện tại bất kể loại danh sách cơ bản. Không có gì trong khuôn khổ tự động triển khai lập phiên bản đối tượng cho các đối tượng thuần túy. Bạn có thể sử dụng DataTables / DataRows, giữ bản sao gốc của dữ liệu chỉ cho mục đích này.
Alex J,

Bạn nói điều khiển cần biết khi nào danh sách thay đổi, bạn có thể giải thích thêm không? Tôi có một biểu mẫu có chế độ xem dữ liệu và sau đó là một biểu mẫu khác từ đó có dữ liệu được phổ biến. Tôi có cần quan tâm đến những gì bạn nói trong vấn đề này không?
Jon

Ví dụ: DataGrid cần biết khi nào các mục được thêm vào danh sách của bạn để thêm một hàng mới. Đối với điều đó, nó sử dụng sự kiện ListChanged của BindingList. Nếu bạn đang liên kết lưới trực tiếp với Danh sách <T>, bạn sẽ không có sự kiện và lưới sẽ không thể biết khi nào bạn thay đổi danh sách. Bạn không phải lo lắng về điều đó trong trường hợp của mình vì BindingSource sẽ bao bọc Danh sách <T> trong BindingList cho bạn. Miễn là bạn làm việc với BindingSource chứ không phải chính danh sách, các điều khiển sẽ vẫn đồng bộ.
Alex J,

Có giải pháp nào để sử dụng BindingList cho WPF UI (theo cách mvvm) không? Tôi có thể bọc danh sách ràng buộc thành một bộ sưu tập có thể quan sát được không?
Lance

12

BindingList cho phép kết hợp dữ liệu hai chiều bằng cách sử dụng các sự kiện, một Danh sách không kích hoạt các sự kiện khi tập hợp của nó thay đổi.

Tôi không nghĩ rằng nó sẽ khắc phục được vấn đề cụ thể của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.