Desidero visualizzare più istanze di una classe nel mio PropertyGrid
. La classe assomiglia a questo:PropertyGrid proprietà readonly a livello di oggetto
public class Parameter
{
[Description("the name")]
public string Name { get; set; }
[Description("the value"), ReadOnly(true)]
public string Value { get; set; }
[Description("the description")]
public string Description { get; set; }
}
Ho molte istanze di quella classe in un TreeView
. Quando seleziono uno di essi nel mio TreeView
, le proprietà appaiono nello PropertyGrid
come previsto. Fin qui tutto bene, ma voglio personalizzare questo comportamento nel modo seguente:
Per ogni singola istanza, voglio essere in grado di impedire all'utente di modificare una proprietà specifica. Impostando ReadOnly(true)
nella mia classe (come puoi vedere nell'esempio sopra), tutte le proprietà Value
verranno disabilitate su un livello di classe.
Dopo alcune ricerche ho trovato la seguente soluzione che mi dà la possibilità di abilitare/disabilitare una specifica proprietà in fase di esecuzione:
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(this)["Value"];
ReadOnlyAttribute attr =
(ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)];
FieldInfo isReadOnly = attr.GetType().GetField(
"isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
isReadOnly.SetValue(attr, false);
Questo approccio funziona bene, ma purtroppo anche in unica classe di livello. Ciò significa che se imposto il numero , del Parameter
- gli oggetti hanno la proprietà Value
scrivibile. Ma lo voglio SOLO su quell'unico oggetto particolare (quindi a livello di oggetto). Non voglio davvero creare classi separate per le proprietà read/write e readonly.
Come io sono a corto di idee, il vostro aiuto è molto apprezzato :)
Grazie in anticipo!
MODIFICA: ho bisogno che le proprietà di sola lettura siano disattivate, in modo che l'utente possa vedere che non è consentito o possibile modificarle.
Ho letto l'intero documento ma ancora non capisco la tua idea. Potresti fornirmi un piccolo esempio di codice per renderlo un po 'più chiaro? Grazie per il tuo tempo :) –
Consulta il paragrafo * Uso dinamico * in quell'articolo. In breve: applica un PropertyAttributesProviderAttribute alla tua proprietà, scrivi il tuo provider e sostituisci gli attributi dall'insieme PropertyAttributes basato sull'oggetto stesso (e non sulla classe). –
Come posso vedere nel codice sorgente, è necessario utilizzare l'implementazione PropertyGrid personalizzata dell'autore per farlo funzionare? Nel mio caso devo usare un PropertyGrid esistente che si trova all'interno di una DLL (che non posso modificare). –