我有一个PropertyGrid,它绑定了一些类属性.
我try 将其ReadOnly
属性更改为true
,然后在我的编辑器类中更改该值,然后在带有反射的properties setter方法中重置它,但这无法正常工作,因为textfield仍处于焦点模式,我仍然可以进行更改.此外,对我来说,这更像是一种变通方法,而不是一种可接受的解决方案.
有没有办法只通过EditorComponent
类而不是PropertyGrid访问我的属性的setter?
我的自定义编辑器类:
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
using (EditorForm f = new Forms.EditorForm(value.ToString()))
{
if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
PropertyDescriptor descriptor = context.PropertyDescriptor;
if (descriptor != null)
{
ReadOnlyAttribute attribute = descriptor.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
if (attribute != null)
{
System.Reflection.FieldInfo fieldToChange = attribute.GetType().GetField("isReadOnly", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (fieldToChange != null)
{
fieldToChange.SetValue(attribute, false); // setting it to false
value = f.Text;
}
}
}
}
}
return value;
}
在这之后,我用setter方法重新更改它:
private string _myText = String.Empty;
[Editor(typeof(...), typeof(UITypeEditor)),
ReadOnly(true)]
public string MyText
{
get { return _myText; }
set
{
_myText = value;
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(this)["MyText"];
if (descriptor != null)
{
ReadOnlyAttribute attribute = descriptor.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
if (attribute != null)
{
System.Reflection.FieldInfo fieldToChange = attribute.GetType().GetField("isReadOnly", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (fieldToChange != null)
fieldToChange.SetValue(attribute, true); // resetting it to true
}
}
}
}