سؤال

لدي مجموعة من 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]) المستخدمة، كما هو محدد أعلاه
    • وإلا، فلن تتوفر بيانات التعريف
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top