2011-01-13 36 views
10

Tôi muốn hiển thị danh sách những người trong số DataGridView trong ứng dụng Windows Forms. Tôi muốn lớp dịch vụ của mình trả về danh sách các đối tượng Person (ví dụ: IList<Person>). Tôi muốn thay đổi trong danh sách được phản ánh trong DataGridView và ngược lại. Sự hiểu biết của tôi là sử dụng BindingSource tạo điều kiện làm việc với DataGridView. Câu hỏi của tôi là dành cho hai chiều databinding để làm việc, tôi cần:Tôi có cần BindingSource và BindingList cho WinForms DataBinding không?

//pseudo code 
BindingSource.DataSource = IBindingList<Person> 

hoặc tôi có thể làm:

BindingSource.DataSource = IList<Person> 

sự khác biệt là gì? Nếu tôi thực hiện thay đổi cho danh sách sẽ DataGridView được cập nhật theo cách nào? Và nếu tôi phải sử dụng các BindingList, có vẻ như một chút hào nhoáng (vì tạo ra một sự phụ thuộc) để trả lại một BindingList từ lớp dịch vụ của tôi, là có một cách xung quanh đó?

Microsoft nói về BindingList (trong phần chú thích) http://msdn.microsoft.com/en-us/library/ms132679.aspx:

"Tuy nhiên, các giải pháp điển hình lập trình viên sẽ sử dụng một lớp cung cấp chức năng liên kết dữ liệu, như BindingSource, thay vì trực tiếp sử dụng BindingList<T>. "

Trả lời

3

Nếu bạn sử dụng BindingList<T> thì thay đổi bạn thực hiện qua danh sách cơ bản sẽ được phản ánh trong điều khiển bị ràng buộc dữ liệu vì BindingList đặt ra sự kiện khi danh sách bị thay đổi. Hầu hết các bộ sưu tập khác thì không.

Nếu bạn sử dụng bộ sưu tập bình thường làm nguồn dữ liệu thì các thay đổi mà bạn thực hiện thông qua các điều khiển ràng buộc dữ liệu khác (hoặc thông qua BindingSource) sẽ vẫn được phản ánh, nhưng thay đổi trực tiếp đến bộ sưu tập cơ bản sẽ không.

+0

Một phần của sự nhầm lẫn của tôi là một số người dường như đề nghị bạn không cần phải sử dụng một BindingList để có được dữ liệu hai chiều miễn là bạn đang sử dụng một BindingSource. Nhưng tôi đoán những gì bạn đang nói là điều đó chỉ đúng nếu bạn chỉ sửa đổi danh sách thông qua BindingSource. – User

10

Ràng buộc với một IList<Person> sẽ chỉ cung cấp cho bạn một chiều ràng buộc; thay đổi đối với danh sách hoặc mục danh sách sẽ không được phản ánh trong số DataGridView. Thay vào đó, bạn có thể sử dụng BindingList hoặc BindingSource để nhận chức năng này, nhưng lớp Person của bạn sẽ vẫn cần hỗ trợ INotifyPropertyChanged nếu không bạn sẽ chỉ nhận được đồng bộ hóa khi các mục được thêm/xóa vào/khỏi danh sách, chứ không phải khi bản thân các mục danh sách thay đổi.

Nếu bạn muốn tránh sự phụ thuộc vào System.Windows.Forms, bạn có thể sử dụng ObservableCollection<Person> thay thế; điều này hỗ trợ các thông báo thay đổi cần thiết và do đó có thể được sử dụng như một nguồn ràng buộc hai chiều.

+6

Trừ khi anh ta sử dụng .NET 4, ObservableCollection mang một sự phụ thuộc nặng nề hơn nữa bởi vì nó được định nghĩa trong một assembly WPF (WindowsBase). Nó chỉ được chuyển đến System.dll trong .NET 4. – Josh

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