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