ฉันจัดการเพื่อให้สามารถเพิ่มคอลัมน์แบบไดนามิกได้โดยใช้โค้ดเพียงบรรทัดดังนี้:
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
สำหรับคำถามนี้ไม่ใช่โซลูชันที่ใช้ XAML (เนื่องจากตามที่กล่าวไปแล้วไม่มีวิธีที่สมเหตุสมผลในการทำเช่นนั้น) ทั้งยังไม่ใช่โซลูชันที่ทำงานโดยตรงกับ DataGrid.Columns มันทำงานร่วมกับ ItemsSource ที่ผูกกับ DataGrid ซึ่งใช้ ITypedList และด้วยเหตุนี้จึงมีวิธีการที่กำหนดเองสำหรับการดึง PropertyDescriptor ในที่เดียวในโค้ดคุณสามารถกำหนด "แถวข้อมูล" และ "คอลัมน์ข้อมูล" สำหรับกริดของคุณได้
หากคุณมี:
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
คุณสามารถใช้ตัวอย่างเช่น:
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)
และกริดของคุณโดยใช้การผูกกับ MyItemsCollection จะถูกเติมด้วยคอลัมน์ที่เกี่ยวข้อง คอลัมน์เหล่านั้นสามารถแก้ไขได้ (เพิ่มใหม่หรือลบที่มีอยู่แล้ว) ที่รันไทม์แบบไดนามิกและกริดจะรีเฟรชคอลเลกชันคอลัมน์โดยอัตโนมัติ
DynamicPropertyDescriptor ที่กล่าวถึงข้างต้นเป็นเพียงการอัปเกรดเป็น PropertyDescriptor ปกติและให้คำจำกัดความคอลัมน์ที่พิมพ์อย่างชัดเจนพร้อมตัวเลือกเพิ่มเติมบางอย่าง DynamicDataGridSource จะทำงานได้ดีกับ PropertyDescriptor พื้นฐาน