मैंने इसे इस तरह कोड की एक लाइन का उपयोग करके एक कॉलम को गतिशील रूप से जोड़ना संभव बनाया:
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
सवाल के संबंध में, यह एक XAML- आधारित समाधान नहीं है (क्योंकि जैसा कि उल्लेख किया गया है कि ऐसा करने का कोई उचित तरीका नहीं है), न ही यह एक समाधान है जो सीधे डेटाग्रिड के साथ काम करेगा। यह वास्तव में 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 के लिए बाइंडिंग का उपयोग करके आपका ग्रिड संबंधित कॉलम के साथ आबाद होगा। उन स्तंभों को गतिशील रूप से (नए जोड़े या मौजूदा हटाए गए) को गतिशील रूप से संशोधित किया जा सकता है और ग्रिड स्वचालित रूप से इसे कॉलम संग्रह को ताज़ा कर देगा।
ऊपर वर्णित डायनेमिकPropertyDescriptor नियमित PropertyDescriptor का उन्नयन है और इसके अतिरिक्त विकल्पों के साथ दृढ़ता से टाइप किए गए कॉलम की परिभाषा प्रदान करता है। DynamicDataGridSource अन्यथा बेसिक प्रॉपर्टीस्क्रिप्ट के साथ ठीक घटना पर काम करेगा।