The above solution was correct. Our issue was resolved with the following two classes.
internal sealed class ReadOnlyMergedPropertyDataAccessorFactory : TypeDescriptorFactory
{
protected override IPropertyDataAccessor CreateMergedPropertyDataAccessor(
IPropertyDataAccessor parent,
IList<IPropertyDataAccessor> propertyDataAccessors)
{
return new ReadOnlyMergedPropertyDataAccessor(parent, propertyDataAccessors);
}
}
internal sealed class ReadOnlyMergedPropertyDataAccessor : MergedPropertyDataAccessor
{
private bool isReadOnly;
public ReadOnlyMergedPropertyDataAccessor(IList<IPropertyDataAccessor> propertyDataAccessors)
: base(propertyDataAccessors)
{
this.SetReadOnly(propertyDataAccessors);
}
public ReadOnlyMergedPropertyDataAccessor(IPropertyDataAccessor parent, IList<IPropertyDataAccessor> propertyDataAccessors)
: base(parent, propertyDataAccessors)
{
this.SetReadOnly(propertyDataAccessors);
}
public override bool IsReadOnly
{
get { return this.isReadOnly; }
}
private void SetReadOnly(IList<IPropertyDataAccessor> propertyDataAccessors)
{
switch (propertyDataAccessors[0].ValueName)
{
case "DisplayName":
case "Name":
{
this.isReadOnly = true;
break;
}
}
}
}