WPF DataGrid Autocolumn Generation عبر IcustomTypedescriptor
-
02-10-2019 - |
سؤال
في مشروع اختبار ، تمكنت من تلقائي من أعمدة DataGrid WPF في السيناريو التالي ، حيث يتم تخزين البيانات في قاموس ويتم تنفيذ الربط عبر PropertyDescriptors:
public class People:List<Person>{
...
}
public class Person:Dictionary<string,string>,INotifyPropertyChanged,ICustomTypeDescriptor
{
}
المشكلة التي أواجهها هي في مشروع حياتي الحقيقي التي أستخدمها MVVM ، لذا فهي كذلك الناسViewModel الذي يرث ViewModelbase وبالتالي لا يمكن أن يرث القائمةu003CPerson> . لقد حاولت تنفيذ ilistu003CPerson> بدلاً من ذلك مع قائمة داخليةu003CPerson> وإعداد DataContext بشكل صريح إلى ilistu003CPerson> الرجوع ولكن هذا لم ينجح.
لقد رأيت منشورًا مشابهًا على ربط DataGridView هنا, ، لذلك أنا أتساءل عما إذا كان نفس النوع من المنطق ينطبق في WPF وفي المقام الأول ، ما الذي يسبب بالضبط تنفيذ IcustomTypedescriptoru003CT> هذا مفقود عندما تقوم ببساطة بتنفيذ ilistu003CT> في حين أن.
المحلول
ال DataGrid
يستخدم CollectionView
لمجموعتك لإنشاء الخصائص. بشكل أكثر تحديدًا ، يلقي CollectionView
إلى IItemProperties
, الذي الافتراضي CollectionView
لا تنفذ. إذا لم تنفذ IList
(ليس العام العام) ، ثم الافتراضي CollectionView
سوف يستخدم.
لذلك ، تنفيذ غير الجنرال IList
يجب أن تحل الواجهة هذا (List<T>
ينفذ كلاهما ، وهذا هو السبب في أنه يعمل إذا اشتقت من List<Person>
).
نصائح أخرى
نظرًا لأنه لم يتم ذكره بالفعل ، فقد واجهت مشكلة ذات صلة حيث الأعمدة في DataGrid
لم يتم إنشاؤه تلقائيًا عندما لم تكن هناك صفوف ؛ اتضح أن DataGrid
لم يكن ينظر إلى بلدي IItemProperties
التنفيذ على الإطلاق (لا أعرف السبب) ، لكنني كنت أستخدم بحتة ICustomTypeDescriptor
التنفيذ على كل كائن صف فردي لإنشاء الأعمدة ، والتي تعمل أيضًا ولكنها تؤدي إلى عدم وجود أعمدة عندما لا توجد صفوف.
كان الحل هو التنفيذ ITypedList
(غادرت IItemProperties
التنفيذ أيضًا في حالة) على نوع التجميع. الآن أحصل على أعمدة تم إنشاؤها بشكل صحيح بالنسبة لي فيما إذا كانت هناك صفوف أم لا.