2011-09-15 39 views
5

Tôi đang thực hiện một điều khiển người dùng WPF và tôi muốn hành vi tương tự như kiểm soát DataGrid trong ý nghĩa ràng buộc. Câu hỏi của tôi là: DataGrid biết cách liên kết với bất kỳ bộ sưu tập kiểu IEnumerable nào? Ví dụ: Bạn có thể chuyển một DataView dưới dạng ItemsSource và bạn cũng có thể chuyển bất kỳ bộ sưu tập đối tượng nào. Cách DataGrid quyết định có liên kết với một cột của DataView hay chỉ đến thuộc tính của đối tượng bằng cách xem xét điều này:DataGrid liên kết với các thuộc tính của bất kỳ bộ sưu tập nào?

<DataGridTextColumn Binding="{Binding **Path=SomePropertyOrColumn**}"/> 

Cảm ơn trước.

+0

Kiểm tra http: // stackoverflow này.com/questions/5488014/in-wpf-are-binding-path-và-binding-thực sự bình đẳng, http://stackoverflow.com/questions/3504480/when-to-use-path-in-wpf-binding và http://stackoverflow.com/questions/4742449/new-to-wpf-data-binding –

+0

@Sandeep GB Đó không phải là câu hỏi của tôi. Tôi biết làm thế nào để làm ràng buộc, tôi muốn biết làm thế nào để DataGrid làm điều đó internaly với bất kỳ đối tượng. – Vale

Trả lời

3

Đây là khu vực phức tạp; sau đây là một sự cố từ ràng buộc winforms, nhưng tôi hiểu rằng ràng buộc WPF không phải là khác nhau;

  • cho một đối tượng, mã điều đầu tiên ràng buộc sẽ làm là tìm kiếm IListSource - và nếu như vậy sử dụng GetList() để có được những ràng buộc thực tế (đây là cách một dữ liệu bảng trở thành một dữ liệu-view cho các mục đích ràng buộc)
  • sau đó, nguồn thường được kiểm tra cho ITypedList; hành vi này là một cách linh hoạt để thu được các thuộc tính giả (GetItemProperties()) được đại diện bởi mô hình; dữ liệu quan điểm thực hiện ITypedList, tạo giả thuộc tính cho mỗi dụ
  • nếu không, nó có thể là thể xác định một loại rõ ràng cho các dữ liệu, trong đó có thể có nghĩa:
    • tìm kiếm một indexer có dạng public SomeType this[int index] {get;} - lưu ý rằng hầu hết bộ sưu tập sẽ làm hài lòng này
    • (không được thực hiện bởi winforms, nhưng có thể cho WPF) giải quyết thông qua phản ánh sự T trong cả hai IList<T> hoặc IEnumerable<T> nếu đối tượng thực hiện những giao diện
    • lấy đối tượng đầu tiên (nếu có) từ Sorce, và sử dụng GetType()
  • khi một loại được biết, TypeDescriptor.GetProperties(type) có thể được sử dụng để lấy thuộc tính; trong nhiều trường hợp, điều này sẽ thông qua sự phản chiếu, nhưng cũng có thể thêm một lớp vô hướng (thông qua TypeDescriptionProvider) để cung cấp các thuộc tính cho một loại (điều này có thể được thêm vào trong thời gian chạy, rất thuận tiện). cá nhân ràng buộc (không phải danh sách ràng buộc), cũng có TypeDescriptor.GetProperties(obj) - ngoài phản ánh và TypeDescriptionProvider, điều này cũng có hỗ trợ cho ICustomTypeDescriptor có thể được thực hiện bởi một đối tượng cá nhân để cung cấp thuộc tính tùy chỉnh trong thời gian chạy (rất giống với TypeDescriptionProvider, nhưng với cá nhân đối tượng chịu trách nhiệm về các tài sản)

Tôi không biết chính xác bao nhiêu điều này áp dụng cho ràng buộc WPF, nhưng tôi khá chắc chắn rằngViệc xử lývà ITypedList giống hệt nhau. Từ bộ nhớ, hầu hết (tất cả?) Của các chiến lược winforms sẽ làm việc trên WPF - vì vậy nó có thể được rằng và thay đổi là bổ sung móc.

+0

Cảm ơn, câu trả lời của bạn đã cho tôi ý tưởng làm thế nào để giải quyết vấn đề của tôi. – Vale

0

Tôi nghĩ rằng:

bạn có thể nhận Type của nguyên tố của Collection của nó, loại này TypeGetProperties() phương pháp, mà trả về tất cả tài sản công cộng có sẵn trong loại của nó, và sau khi nó biết tất cả tài sản công cộng, nó có thể ràng buộc với họ.

+0

Có, nhưng nó hoạt động như thế nào với DataView? Nó là một tập hợp các đối tượng DataRowView, và những đối tượng này không có thuộc tính Cột và chúng vẫn được liên kết với các cột. – Vale

+0

Tôi nghĩ rằng bài viết này sẽ giúp [MSDN] (http://msdn.microsoft.com/en-US/library/bb669099 (v = VS.100) .aspx). Trường (chuỗi) - bạn có thể tìm kiếm điều này không? – stukselbax

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