Limitare i valori possibili di una proprietà durante l’editazione tramite PropertyGrid
Come avevo scritto nel post Considerazioni sulla gestione delle impostazioni di applicazioni WinForm tramite PropertyGrid talvolta per applicazioni WindowsForms può essere comodo utilizzare un PropertyGrid per l’editazione di impostazioni. Sempre in tali scenari può essere utile personalizzare l’impostazione di una proprietà restringendo la scelta del valore ad un set predefinito di valori.
Per limitare i valori che una proprietà può assumere quando viene è editata in un PropertyGrid è possibile implementare un TypeConverter personalizzato. Di seguito un esempio tratto PowerTray un’applicazione .NET WinForms che sto sviluppando a tempo perso e che ha l’obbiettivo di poter eseguire script PowerShell e di visualizzare l’output quando lo si desidera tramite una un’icona nella tray bar.
Di seguito la definizione della proprietà PredefinedScriptName decorata con l’attributo System.ComponentModel.TypeConverter che specifica l’utilizzo del TypeConverter personalizzato PredefinedScriptNameConverter:
<System.ComponentModel.TypeConverter(GetType(PredefinedScriptNameConverter))>
<System.ComponentModel.Category(PSScriptSettings.SourceCategory)>
<System.ComponentModel.DisplayName(“Source predefined script”)>
<System.ComponentModel.DefaultValue(“”)>
<System.ComponentModel.ReadOnly(True)>
Public Property PredefinedScriptName() As String
Di seguito invece la definizione del TypeConverter PredefinedScriptNameConverter che tramite il metodo GetStandardValues ritorna i valori possibili assunti dalla proprietà durante l’editiong:
Public Class PredefinedScriptNameConverter
Inherits System.ComponentModel.StringConverter
Public Overrides Function GetStandardValuesSupported(context As ITypeDescriptorContext) As Boolean
‘true if GetStandardValues() should be called to find a common set of values the object supports
Return True
End Function
Public Overrides Function GetStandardValuesExclusive(context As ITypeDescriptorContext) As Boolean
‘true if the TypeConverter.StandardValuesCollection returned from GetStandardValues() is an exhaustive list of possible values
Return True
End Function
Public Overrides Function GetStandardValues(context As ITypeDescriptorContext) As StandardValuesCollection
Dim names(PowerTraySettings.PSPredefinedScripts.Count) As String
names(0) = String.Empty
If PowerTraySettings.PSPredefinedScripts.Count > 0 Then
PowerTraySettings.PSPredefinedScripts.Keys.CopyTo(names, 1)
End If
Return New StandardValuesCollection(names)
End Function
End Class