سؤال

في مشروع اختبار ، تمكنت من تلقائي من أعمدة 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 التنفيذ أيضًا في حالة) على نوع التجميع. الآن أحصل على أعمدة تم إنشاؤها بشكل صحيح بالنسبة لي فيما إذا كانت هناك صفوف أم لا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top