Δημιουργία design-time combo-style String property για user control
Εψαχνα αρκετές ημέρες, λόγω της μικρής μου εξοικείωσης με το design-time των user controls σε Windows Forms, για να καταλάβω πώς γίνεται να δημιουργήσουμε ένα string property το οποίο να φαίνεται μεν στον designer, αλλά να σου δίνει μια συγκεκριμένη λίστα επιλογών (ενα combo δηλαδή) για να διαλέξεις.
Γενικά, αν χρησιμοποιήσουμε κάποιο enumeration, το πράγμα κυλάει μόνο του. Αν όμως έχουμε String property και θέλουμε να επιλέξουμε μεταξύ συγκεκριμένων Strings, τότε το πρόβλημά μας ανάγεται στο πρόβλημα που θα αντιμετωπίζαμε χρησιμοποιώντας οποιοδήποτε άλλο Object ως property του user control μας.
Ητοι, για να δείξουμε μια combobox-style επιλογή σε design time για το συγκεκριμένο property του user control, χρειαζόμαστε ένα custom type converter.
Θα δουμε παρακάτω πώς γίνεται αυτό. Καταρχήν χρειαζόμαστε μια νέα κλάση:
Class MyListConverter
Inherits System.ComponentModel.StringConverter
'Εδώ φορτώνουμε τις τιμές μας.
Public Overloads Overrides Function GetStandardValues( _
ByVal context As System.ComponentModel.ITypeDescriptorContext) _
As System.ComponentModel.TypeConverter.StandardValuesCollection
Dim C As Collection = New Collection
C.Add("Option 1")
C.Add("Option 2")
C.Add("Option 3")
Return New StandardValuesCollection(C)
End Function
'Εδώ μπορούμε να κάνουμε return True αν θέλουμε να επιλέγουμε μόνο από τις προκαθορισμένες τιμές
'ή False αν θέλουμε να μπορούμε να γράψουμε και δικές μας τιμές.
Public Overloads Overrides Function GetStandardValuesExclusive( _
ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
Return False
End Function
Public Overloads Overrides Function GetStandardValuesSupported( _
ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
Return True
End Function
End Class
Τώρα που έχουμε το δικό μας Type Converter, πρέπει να τον "δέσουμε" με μια property του control Ας δούμε πώς:
<System.ComponentModel.TypeConverter(GetType(MyListConverter))> _
Public Property MyProperty() As Object
Get
Return (_myPrivateVariable)
End Get
Set(ByVal Value As Object)
_myPrivateVariable = Value
End Set
End Property
Απλά δηλαδή σε ένα τυπικό Property definition προσθέτουμε το attribute που βλέπετε από πάνω. Το type που θέλουμε είναι το type της κλάσης που μόλις φτιάξαμε (MyListConverter). Το Property πρέπει να είναι οπωσδήποτε τύπου Object (πράγμα που δεν μας ενοχλεί, μια και τα Strings είναι objects), ενώ η _myPrivateVariable είναι και αυτή τύπου Οbject και αποτελεί την property backer variable μας.