J'ai un contrôle utilisateur qui affiche les objets d'un type déclaré par le client avec un comportement spécialisé. Je voudrais utiliser des génériques. Cependant, je ne suis pas sûr de savoir comment déclarer ceci dans le XAML:Les génériques peuvent-ils être utilisés avec Silverlight?
<local:EditableListBox x:Name="SectionList" Margin="56,8,15,0" FontSize="64" SelectionChanged="SectionList_SelectionChanged" />
ListBox
utilise object
membres, qui me fait penser que peut-être il n'y a pas moyen d'avoir ici la sécurité de type. Ou est-ce?
(Je construis une application Windows Phone 7, si cela fait une différence.)
Mise à jour: Je suis tout à fait bien de ne pas avoir des génériques dans le XAML, mais je suis encore à essayer comprendre comment l'installer dans le code-behind. J'ai tout paramétré, mais il se plaint toujours.
code derrière:
public partial class EditableListBox<T> : UserControl, INotifyPropertyChanged where T : IEditableListMember {
public EditableListBox()
{
// Error: The name 'InitializeComponent' does not exist in the current context
InitializeComponent();
Loaded += new RoutedEventHandler(EditableListBox_Loaded);
}
// ...
public int SelectedIndex
{
get
{
// Error: The name 'ContentListBox' does not exist in the current context
return ContentListBox.SelectedIndex;
}
set
{
// Error: The name 'ContentListBox' does not exist in the current context
ContentListBox.SelectedIndex = value;
}
}
Le XAML:
<Grid x:Name="LayoutRoot">
<ListBox x:Name="ContentListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid ManipulationCompleted="Grid_ManipulationCompleted">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Source="{Binding IconSource}"
Grid.Column="0"
Width="96"
Height="96"
VerticalAlignment="Center"
Visibility="{Binding Editing, Converter={StaticResource visibilityConverter}}"
/>
<TextBlock Text="{Binding Name}"
Grid.Column="1"
Foreground="{Binding Enabled, Converter={StaticResource enabledConverter}}" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
Il donne deux erreurs du compilateur: le ListBox
ContentListBox
et InitializeComponent()
ne sont pas définis. Je soupçonne que le problème a quelque chose à voir avec la façon dont la classe est divisée en deux définitions partial
, et la mienne est paramétrée alors que le code généré ne l'est pas. Comment puis-je contourner cela?
Apparemment pas sorti de la boîte. Jetez un oeil à can-i-spécifiez-un-generic-type-in-xaml –
Tout ce qui doit être déclaré en XAML ne peut pas avoir de paramètre générique. Je recommande de ne pas essayer les génériques sur tout ce qui dérive de 'Control' mais il est possible de le créer en code. Il n'existe aucun moyen de spécifier les génériques dans le code XAML afin que votre code ne puisse pas avoir de paramètre générique. – Stephan