j'ai une classe de base abstraite aComponent
et sous-classes CriteriaList
, Question
, etc.charge WPF UserControl dynamiquement
Pour chaque sous-classe I ai deux correspondant UserControl
s qui ont des noms comme , ubCriteriaList
, ueQuestion
, ubQuestion
, etc. (ue
se tient l'abréviation de « UserControl
avec des éléments d'entrée », et ub
pour « UserControl
avec des boutons ».)
le DataContext
est le « ControllerClass » avec une propriété avec my_aComponent
en tant que getter pour l'instance réelle aComponent
. Lorsque l'instance aComponent
change (par exemple pour une instance de CriteriaList
), je souhaite charger les UserControls correspondants (dans ce cas, ueCriteriaList et ubCriteriaList).
I ont deux convertisseurs ueControlConverter
et ubControlConverter
qui prend le nom de classe (par exemple CriteriaList
) et renvoyer une instance UserControl
(dans ce cas,).
Public Class ueControlConverter
Implements IValueConverter
Public Function Convert(value As Object, targetType As Type, parameter As Object,
culture As System.Globalization.CultureInfo) As Object
Implements IValueConverter.Convert
Dim aComp As aComponent = value
Dim assemblyKlassenname As String = aComp.GetType.ToString
Dim assemblyName As String = Left(assemblyKlassenname,
assemblyKlassenname.IndexOf(".") + 1)
Dim klassenName As String = Right(assemblyKlassenname,
assemblyKlassenname.IndexOf(".") - 1)
Dim t As Type = Type.GetType(assemblyName & "ue" & klassenName)
Dim o As UserControl = Activator.CreateInstance(t)
o.DataContext = value
Return o
End Function
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object,
culture As System.Globalization.CultureInfo) As Object
Implements IValueConverter.ConvertBack
Return value
End Function
End Class
En XAML J'ai deux ContentControl
s qui lient Content="{Binding Path=my_aComponent, Converter={StaticResource _ueControlConverter}
et Content="{Binding Path=my_aComponent, Converter={StaticResource _ubControlConverter}
. Les bons UserControl
s sont affichés mais sans se lier à my_aComponent
.
Que puis-je faire?
Conseil: .NET est meilleur que VB6! 'Dim divisé As String = assemblyKlassenname.Split ({". "C), 2)' 'Dim assemblyKlassenname As String = split (0)' 'Dim klassenName As String = split (1)' – Ryan