سؤال

وتنفس الصعداء، سؤال PropertyGrid آخر. اعتقدت أنني يمكن أن التفاف على هذا حتى واجهت مشكلة حيث لم أستطع تجنب ذلك في الواقع.

ولدي خاصية منطقية التي تحتاج في بعض الأحيان إلى أن تكون للقراءة فقط، وأحيانا يجب أن يكون للتغيير اعتمادا على الكائن المحدد من تريفيف.

وسؤالي هو: كيف يمكنني تغيير ReadOnlyAttribute للعقار حيوي؟ من الواضح، وخلق متغير منطقية ومن ثم محاولة تعيين مثل ReadOnlyAttribute (boolVar) لا يعمل والآن أنا من الأفكار.

والحل الوحيد الذي يمكنني أن أفكر من هو خلق، وفصول منفصلة شبه متطابقة للسلع حيث هذه الخاصية هي للكتابة واحدة للقراءة فقط، ولكن هذا يبدو قليلا unelegant لي.

مساعدة؟ :)

هل كانت مفيدة؟

المحلول

ما أود القيام به هو خلق فئة أساسية مع نسخة محمية الملكية، ثم إنشاء اثنين من الفئات التي ترث الفئة الأساسية التي لديها للقراءة فقط وبت غير للقراءة فقط.

نصائح أخرى

ويمكنك توفير معلومات حيوية عن خصائص فئة إلى شبكة الملكية من خلال تنفيذ <وأ href = "http://msdn.microsoft.com/en-us/library/system.componentmodel.icustomtypedescriptor(loband). ASPX "يختلط =" نوفولو noreferrer "> ICustomTypeDescriptor .

والشبكة الملكية سيدعو ICustomTypeDescriptor.GetProperties () و تعود مجموعة من الكائنات المستمدة من PropertyDescriptors . في التطبيق الخاص بك يمكنك تجاوز PropertyDescriptor.IsReadOnly الممتلكات وتنفيذ المنطق الخاص.

وهذا هو قدرا كبيرا من العمل في المقام الأول، لكنه يتيح لك إمكانية لإرجاع اسم الخاصية ووصف (مفيدة للتوطين)، بمناسبة خصائص حيوي حيوي للقراءة فقط، dynamiclly إظهار وإخفاء خصائص، و تفعل الكثير من الأشياء مفيدة أخرى.

وقد تتمكن من محاولة شيء على طول هذه الخطوط لتجنب تحويل نوع تتعامل مع فئات متعددة:

class TestClass
{
    private bool isMyPropertyReadOnly;

    public bool IsMyPropertyReadOnly
    {
        get { return isMyPropertyReadOnly; }
        set { isMyPropertyReadOnly = value; }
    }

    private int myVar;

    public int MyProperty
    {
        get { return myVar; }

        set
        {
            if (isMyPropertyReadOnly)
            {
                throw new System.Exception("The MyProperty property is read-only.");
            }
            else
            {
                myVar = value;
            }
        }
    }
}
scroll top