PropertyGrid: modifica dinamica di ReadOnlyAttribute
-
10-07-2019 - |
Domanda
Sospiro, un'altra domanda di PropertyGrid. Ho pensato di poter aggirare questo problema fino a quando non ho riscontrato un problema in cui non potevo davvero evitarlo.
Ho una proprietà booleana che a volte deve essere di sola lettura e talvolta deve essere modificabile a seconda dell'oggetto selezionato da TreeView.
La mia domanda è: come posso modificare dinamicamente ReadOnlyAttribute di una proprietà? Ovviamente, creare una variabile booleana e quindi provare a impostarla come ReadOnlyAttribute (boolVar) non funziona e ora non ho più idee.
L'unica soluzione che mi viene in mente è la creazione di classi separate, quasi identiche per gli elementi in cui questa proprietà è scrivibile e una per sola lettura, ma questo mi sembra un po 'poco elegante.
Aiuto? :)
Soluzione
Quello che vorrei fare è creare una classe base con una versione protetta della proprietà, quindi creare due classi che ereditano la classe base che ha i bit di sola lettura e non di sola lettura.
Altri suggerimenti
È possibile fornire informazioni dinamiche sulle proprietà di una classe in una griglia di proprietà implementando ICustomTypeDescriptor .
La griglia delle proprietà chiamerà ICustomTypeDescriptor.GetProperties () e viene restituita una raccolta di oggetti derivati ??da PropertyDescriptors . Nella tua implementazione puoi sovrascrivere PropertyDescriptor.IsReadOnly proprietà e implementa la tua logica.
In primo luogo, questo è un bel po 'di lavoro, ma ti dà la possibilità di restituire dinamicamente un nome e una descrizione di proprietà (utile per la localizzazione), contrassegnare dinamicamente le proprietà come di sola lettura, mostrare e nascondere dinamicamente le proprietà e fare molte altre cose utili.
Puoi provare qualcosa in questo senso per evitare la conversione del tipo coinvolta in più classi:
class TestClass
{
private bool isMyPropertyReadOnly;
public bool IsMyPropertyReadOnly
{
get { return isMyPropertyReadOnly; }
set { isMyPropertyReadOnly = value; }
}
private int myVar;
public int MyProperty
{
get { return myVar; }
set
{
if (isMyPropertyReadOnly)
{
throw new System.Exception("The MyProperty property is read-only.");
}
else
{
myVar = value;
}
}
}
}