#if !SILVERLIGHT using System; using System.Linq; using System.ComponentModel; namespace System.ComponentModel.DataAnnotations { internal class MetadataPropertyDescriptorWrapper : PropertyDescriptor { private PropertyDescriptor _descriptor; private bool _isReadOnly; public MetadataPropertyDescriptorWrapper(PropertyDescriptor descriptor, Attribute[] newAttributes) : base(descriptor, newAttributes) { _descriptor = descriptor; var readOnlyAttribute = newAttributes.OfType().FirstOrDefault(); _isReadOnly = (readOnlyAttribute != null ? readOnlyAttribute.IsReadOnly : false); } public override void AddValueChanged(object component, EventHandler handler) { _descriptor.AddValueChanged(component, handler); } public override bool CanResetValue(object component) { return _descriptor.CanResetValue(component); } public override Type ComponentType { get { return _descriptor.ComponentType; } } public override object GetValue(object component) { return _descriptor.GetValue(component); } public override bool IsReadOnly { get { // Dev10 Bug 594083 // It's not enough to call the wrapped _descriptor because it does not know anything about // new attributes passed into the constructor of this class. return _isReadOnly || _descriptor.IsReadOnly; } } public override Type PropertyType { get { return _descriptor.PropertyType; } } public override void RemoveValueChanged(object component, EventHandler handler) { _descriptor.RemoveValueChanged(component, handler); } public override void ResetValue(object component) { _descriptor.ResetValue(component); } public override void SetValue(object component, object value) { _descriptor.SetValue(component, value); } public override bool ShouldSerializeValue(object component) { return _descriptor.ShouldSerializeValue(component); } public override bool SupportsChangeEvents { get { return _descriptor.SupportsChangeEvents; } } } } #endif