Здравствуйте, _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 имеет смысл кешировать, вычислив их только один раз. Возможно, уже в конструкторе. Для этого понадобится только один проход по списку атрибутов.
Можно пожалуйста по подробние?