Tôi đã quản lý để có thể tự động thêm một cột chỉ bằng một dòng mã như thế này:
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
Liên quan đến câu hỏi, đây không phải là giải pháp dựa trên XAML (vì như đã đề cập, không có cách nào hợp lý để thực hiện), đây cũng không phải là giải pháp hoạt động trực tiếp với DataGrid.Columns. Nó thực sự hoạt động với ItemSource ràng buộc DataGrid, thực hiện ITypedList và do đó cung cấp các phương thức tùy chỉnh để truy xuất PropertyDescriptor. Ở một nơi trong mã, bạn có thể xác định "hàng dữ liệu" và "cột dữ liệu" cho lưới của mình.
Nếu bạn có:
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
bạn có thể sử dụng ví dụ:
var descriptors= new List<PropertyDescriptor>();
//retrieve column name from preprepared list or retrieve from one of the items in dictionary
foreach(var columnName in ColumnNames)
descriptors.Add(new DynamicPropertyDescriptor<Dictionary, string>(ColumnName, x => x[columnName]))
MyItemsCollection = new DynamicDataGridSource(Rows, descriptors)
và lưới của bạn bằng cách sử dụng liên kết với MyItemsCollection sẽ được điền với các cột tương ứng. Các cột đó có thể được sửa đổi (bổ sung mới hoặc loại bỏ hiện tại) trong thời gian chạy động và lưới sẽ tự động làm mới bộ sưu tập cột của nó.
DynamicPropertyDescriptor được đề cập ở trên chỉ là một bản nâng cấp lên PropertyDescriptor thông thường và cung cấp định nghĩa cột được gõ mạnh với một số tùy chọn bổ sung. DynamicDataGridSource nếu không sẽ chỉ hoạt động tốt với sự kiện cơ bản.