2010-11-15 5 views
0

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 ListBoxContentListBox 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?

+0

Apparemment pas sorti de la boîte. Jetez un oeil à can-i-spécifiez-un-generic-type-in-xaml –

+0

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

Répondre

2

Non, vous ne pouvez pas utiliser directement les types génériques dans Silverlight XAML.

Mais vous pouvez vous familiariser avec le MVVM pattern. Vos modèles et viewmodels peuvent facilement être des types génériques, et vous pouvez y faire tout votre codage. Les vues XAML sont muettes, n'ont pas ou peu de code derrière, et se lient uniquement aux modèles de vue.

0

vous pouvez utiliser des génériques dans le code-behind. pas tellement dans le XAML. Pardon. Vous allez devoir générer le XAML ou créer les contrôles (etc.) dans votre codebehind, je pense.

[clarification]
Ce que je veux dire est, dans le code-behind vous pouvez utiliser les médicaments génériques que vous attendez. en créant un List<> de T, en créant un Dicationary<>, etc.

Vous pouvez générer du code XAML à la volée en utilisant XamlReader et XamlWriter.

+0

Pouvez-vous spécifier comment? J'essaie de le faire mais ça ne marche pas (voir ci-dessus). –

0

Je ne suis pas sûr de Silverlight. Mais this post donne un lien vers une approche alternative.

0

Il n'existe aucun moyen d'utiliser des génériques dans XAML, mais ils peuvent être utilisés dans le code C# de votre projet Silverlight. Si vous le pouvez, vous pouvez créer un type dérivé du type générique avec un type spécifié, puis le créer en XAML.

Questions connexes