أضف سمة فئة إلى PropertyDescriptor
-
05-07-2019 - |
سؤال
لدي مجموعة من PropertyDescriptor المخصصة التي أرغب في إضافة فئات إليها أيضًا حتى يتم عرضها بطريقة أكثر تنظيمًا في PropertyGrid.أريد أن يدخل كل نوع من أنواع PropertyDescriptor في فئة معينة.
لقد حاولت استخدام TypeDescriptor.AddAttributes() لإضافة سمات إلى PropertyDescriptor موجود، ولكن لم تتم إضافة سمة الفئة.
CategoryAttribute intrinsicPropertyCategory = new CategoryAttribute("Intrinsic Properties");
currentDescriptor = new IntrinsicPropertyDescriptor(def);
TypeDescriptor.AddAttributes(currentDescriptor, new Attribute[] { intrinsicPropertyCategory });
لقد حاولت أيضًا استخدام TypeDescriptor.AddAttributes() في مُنشئ أحد PropertyDescriptors الخاص بي كما هو موضح أدناه.لكنها لا تعمل أيضا.
public IntrinsicPropertyDescriptor(IntrinsicPropertyDef propDef): base(propDef.Key, propDef.Attributes)
{
this._type = propDef.Type;
this._key = propDef.Key;
this._readOnly = propDef.ReadOnly;
CategoryAttribute intrinsicPropertyCategory = new CategoryAttribute("Intrinsic Properties");
TypeDescriptor.AddAttributes(this, new Attribute[] { intrinsicPropertyCategory });
}
أفضل عدم قضاء الوقت في الخوض في تفاصيل سبب قيامي بما أفعله.ولكن في المثال أعلاه، يعتبر IntrinsicPropertyDef فئة تحدد خاصية بما في ذلك الاسم واسم العرض والنوع.لذا فإن PropDef.Attributes يتضمن DisplayNameAttribute.
يمكن عرض IntrinsicPropertyDef مع اثنين من خصائص PropertyDescriptors المخصصة IntrinsicPropertyDescriptor وInferedIntrinsicPropertyDescriptor.يجب أن يكون لكل IntrinsicPropertyDescriptor سمة فئة "الخصائص الجوهرية"، ويجب أن يكون لكل InferedIntrinsicPropertyDescriptor سمة فئة "الخصائص الجوهرية المستنتجة".
المحلول
أنا يعتقد يمكنك فقط تجاوز Category
:
public override string Category { get {return "Foo";}}
لسيناريوهات أخرى؛بشكل عام مع العرف PropertyDescriptor
, ، يمكنك تحديد السمات في المنشئ.سوف تحتاج إلى توسيع Attribute[]
حجة لتشمل CategoryAttribute
.إذا كنت بحاجة إلى إجراء أي معالجة، فيمكنك استخدام طريقة ثابتة - لم يتم اختبارها:
static Attribute[] AddCategory(Attribute[] attributes, string category) {
Array.Resize(ref attributes, attributes.Length + 1);
attributes[attributes.Length - 1] = new CategoryAttribute(category);
return attributes;
}
public IntrinsicPropertyDescriptor(IntrinsicPropertyDef propDef)
: base(propDef.Key, AddCategory(propDef.Attributes, "Foo"))
{...}
أيضًا - لاحظ أنه بالنسبة لـ أ PropertyDescriptor
ليتم استخدامه، يجب على النظام العثور عليه...قواعد القرار هي:
- ل
PropertyGrid
, ، الTypeConverter
يوفر الخصائص، مع افتراض خصائص المثيل (أدناه) - على سبيل المثال:
ICustomTypeDescriptor
مفحوص- وإلا فإنه يتحقق من وجود مسجل
TypeDescriptionProvider
للمثال أو النوع - وإلا يتم استخدام الانعكاس
- لنوع:
- يتحقق من وجود مسجل
TypeDescriptionProvider
للنوع - وإلا يتم استخدام الانعكاس
- يتحقق من وجود مسجل
- للقوائم:
IListSource
تم التحقق منها وحلها في القائمة (تستمر المعالجة)ITypedList
مفحوص- وبخلاف ذلك، يتم التحقق من نوع القائمة بحثًا عن مفهرس غير كائن - أي.
public SomeType this[int index] {get;}
- إذا تم العثور على هذا، ثم خصائص النوع
SomeType
يتم استخدامها، كما هو محدد أعلاه
- إذا تم العثور على هذا، ثم خصائص النوع
- وإلا، إذا لم تكن القائمة فارغة، فإن خصائص المثيل الأول (
list[0]
) المستخدمة، كما هو محدد أعلاه - وإلا، فلن تتوفر بيانات التعريف