Re[2]: Динамическая блокировка свойст в PropertyGrid
От: Ant-Xp Россия  
Дата: 16.06.09 20:28
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Во-вторых, Здравствуйте, Аноним, Вы писали:


А>>Я использую PropertyGrid для отображения свойств объекта, но у меня возникла проблема. Как изменить состояние составного свойства с ReadOnly(false) на ReadOnly(true) при изменении значения другого свойства.

А>>Пробывал использовать PropertyDescriptor, переписал его так:
.....
_FR>Далее. DisplayName, Description, Category имеет смысл кешировать, вычислив их только один раз. Возможно, уже в конструкторе. Для этого понадобится только один проход по списку атрибутов.
.....
Спасибо за помощь в оптимизации!!!
Но проблема после этого осталась. Делло в том что я могу заблокировать одиночное свойство, но если это свойство является классом помеченным атрибутом [TypeConverter(typeof(ExpandableObjectConverter))] то я не могу заблокировать все внутренние свойства данного класса.
Вот исходник класса которым я проверяю на существование аттрибута DynamicReadOnlyAttribute с помощью которго можно заблокировать одиночное свойство в зависимости от значения другого свойства:
using System;
using System.ComponentModel;
using Kernel.PropertySettings.Attributes;


namespace Kernel.PropertySettings.Base
{
    public class GlobalizedObject : ICustomTypeDescriptor
    {
...
        public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
        {
            return GetFilteredProperties(attributes);
        }

        public PropertyDescriptorCollection GetProperties()
        {
            return GetFilteredProperties(new Attribute[0]);
        }

        protected PropertyDescriptorCollection GetFilteredProperties(Attribute[] attributes)
        {
            PropertyDescriptorCollection propertyDescriptorCollection = TypeDescriptor.GetProperties(this,attributes, true);

            var finalProps =new PropertyDescriptorCollection(new PropertyDescriptor[0]);

            foreach (PropertyDescriptor propertyDescriptor in propertyDescriptorCollection)
            {
                bool include = false;
                bool dynamic = false;
                bool readOnly = false;

                var dynamicPropertyFilter = (DynamicPropertyFilterAttribute)
                                            propertyDescriptor.Attributes[typeof (DynamicPropertyFilterAttribute)];
                if (dynamicPropertyFilter != null)
                {
                    dynamic = true;
                    PropertyDescriptor temp =
                        propertyDescriptorCollection[dynamicPropertyFilter.PropertyName];
                    if (dynamicPropertyFilter.ShowOn.IndexOf(temp.GetValue(this).ToString()) > -1)
                        include = true;
                }

                var dynamicReadOnlyAttribute = (DynamicReadOnlyAttribute)
                                               propertyDescriptor.Attributes[typeof (DynamicReadOnlyAttribute)];
                if (dynamicReadOnlyAttribute != null)
                {
                    PropertyDescriptor temp =
                        propertyDescriptorCollection[dynamicReadOnlyAttribute.DependPropertyName];

                    if (dynamicReadOnlyAttribute.DependShowOn.IndexOf(temp.GetValue(this).ToString()) > -1)
                        readOnly = true;
                }

                if (!dynamic || include)
                    finalProps.Add(new GlobalizedPropertyDescriptor(propertyDescriptor,readOnly));
            }
            return finalProps;
        }
    }
}

Как мне быть?
И еще по поводу
_FR>Далее. DisplayName, Description, Category имеет смысл кешировать, вычислив их только один раз. Возможно, уже в конструкторе. Для этого понадобится только один проход по списку атрибутов.
Можно пожалуйста по подробние?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.