2010-03-18 25 views
8

Tôi vẫn đang thử nghiệm với DynamicObjects. Bây giờ tôi cần một số thông tin: Tôi đang cố gắng để ràng buộc một đối tượng kế thừa từ DynamicObject để một DataFrid WPF (không Silverlight).Ràng buộc DynamicObject vào một DataGrid với tạo cột tự động?

Làm cách nào để DataGrid tự động tạo cột của nó từ các thuộc tính công khai có sẵn của đối tượng thường được tạo khi chạy? Điều đó có thực sự có thể?

Trả lời

10

Không có cách thống nhất để truy vấn các thuộc tính động, thông thường bạn sẽ biết chúng trước thời hạn. Với DynamicObject, người triển khai có thể ghi đè GetMemberNames và thường cung cấp cho bạn các thuộc tính, tuy nhiên nó thực sự có nghĩa là gỡ lỗi vì không có yêu cầu rằng nó cung cấp tất cả các thuộc tính. Nếu không, nếu đó là của riêng bạn DynamicObject bạn chỉ cần phải viết phương pháp của riêng bạn để có được các thuộc tính dựa trên thực hiện năng động của bạn. Ví dụ: ExpandoObject cho phép bạn truy vấn tất cả thuộc tính bằng giao diện IDictionary.

Vì vậy, khi bạn có cách để có được các thuộc tính của mình, bạn cần phải thông báo cho DataGrid. Thật không may với một DataGrid, vấn đề với việc thực hiện ICustomTypeDescriptor để cho DataGrid biết về các thuộc tính của bạn là DataGrid lấy TypeDescriptors bằng cách sử dụng loại không phải là cá thể, mà là một vấn đề đối với các đối tượng động, tuy nhiên thực hiện ITypedList trên bộ sưu tập của DynamicObjects sẽ làm việc với Rất nhỏ xíu nếu bạn không triển khai giao diện không chung chung IList trên bộ sưu tập của mình, nó sẽ bị loại bỏ trước khi nó đến điểm mà nó kiểm tra ITypeList.

Tóm lại, triển khai Bộ sưu tập với ITypedListIList. Với ITypedList trả về null cho GetListName và chỉ thực hiện GetItemProperties(PropertyDescriptor[] listAccessors); Bỏ qua listAccessors và trả về một PropertyDescriptorCollection của PropertyDescriptors cho mỗi thành viên được đặt tên dựa trên thể hiện đối tượng động được thể hiện tốt nhất trong danh sách của bạn (rất có thể chỉ là đối tượng đầu tiên). Bạn phải thực hiện một lớp con của PropertyDescriptor, một cách dễ dàng và chung để Get/Set giá trị là sử dụng khuôn khổ opensource Dynamitey

using System; 
using System.ComponentModel; 
using Dynamitey; 
public class DynamicPropertyDescriptor:PropertyDescriptor 
{ 
     public DynamicPropertyDescriptor(string name) : base(name, null) 
     { 
     } 

     public override bool CanResetValue(object component) 
     { 
      return false; 
     } 

     public override object GetValue(object component) 
     { 
      return Dynamic.InvokeGet(component, Name); 
     } 

     public override void ResetValue(object component) 
     { 

     } 

     public override void SetValue(object component, object value) 
     { 
      Dynamic.InvokeSet(component, Name, value); 
     } 

     public override bool ShouldSerializeValue(object component) 
     { 
      return false; 
     } 

     public override Type ComponentType 
     { 
      get { return typeof(object); } 
     } 

     public override bool IsReadOnly 
     { 
      get { return false; } 
     } 

     public override Type PropertyType 
     { 
      get 
      { 
       return typeof (object); 
      } 
     } 
} 
+0

cũng hoạt động trong winforms. Cảm ơn nhiều! – swe

2

Tôi nghĩ rằng DataGrid sử dụng TypeDescriptor để lấy thuộc tính đối tượng để tạo cột. Vì vậy, bạn sẽ có thể đạt được điều này nếu bạn thực hiện DynamicObjectICustomTypeDescriptor. Thực hiện phương thức GetProperties để nó trả về các thuộc tính động của đối tượng của bạn.

+0

Đây là cách để đi với Silverlight trong mọi trường hợp, như SL doesn' t có 'ITypedList'. – McGarnagle

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