2011-07-17 1 views
0

J'utilise ListBox pour afficher une grille. Je veux créer une classe qui sera basée sur (dérivé de) le ListBox et changer le ItemTemplate de cette classe dérivée.Comment utiliser ListBox comme classe de base?

Comment puis-je le faire?

J'essaie de définir une classe dérivée de la classe UserControl - et de changer la classe dérivée en ListBox à côté de la classe UserControl - mais cela ne fonctionne pas.

Existe-t-il un autre moyen?

Je dois avoir la possibilité de changer le modèle ListBoxItem dans le ListBox comme je le fais dans le ListBox que j'ajoute à la page silverlight simple.

Merci pour toute aide.

Répondre

1

ce que vous pouvez faire est de créer un contrôle basé sur un modèle (vous pouvez facilement créer un via des studios visuels Ajouter - Nouveau menu Article) whcich vous dérivez de ListBox:

public class MyListBox : ListBox 
{ 
    public MyListBox() 
    { 
     this.DefaultStyleKey = typeof(MyListBox); 
    } 
} 

Lorsque vous créez un contrôle basé sur un modèle, il sera créez aussi le dossier Themes et là un generic.xaml où vos styles sont définis. Après cela prendre la ListBox - style de here et copier et la coller dans votre generic.xaml à la bonne position (vous avez besoin du ValidationTooltipTemplate aussi):

<Style TargetType="local:MyListBox"> 
     <Setter Property="Padding" Value="1"/> 
     <Setter Property="Background" Value="#FFFFFFFF" /> 
     <Setter Property="Foreground" Value="#FF000000"/> 
     <Setter Property="HorizontalContentAlignment" Value="Left" /> 
     <Setter Property="VerticalContentAlignment" Value="Top" /> 
     <Setter Property="IsTabStop" Value="False" /> 
     <Setter Property="BorderThickness" Value="1" /> 
     <Setter Property="TabNavigation" Value="Once" /> 
     <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> 
     <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
     <Setter Property="BorderBrush"> ... 

Ok, après que vous définissez ItemTemplate dans le même XAML:

<DataTemplate x:Key="MyItemTemplate"> 

et l'ajouter à la liste Setter de votre ListBox style:

<Style TargetType="local:MyListBox"> 
     <Setter Property="ItemTemplate" Value="{StaticResource MyItemTemplate}"/>^ 

Maintenant c'est votre modèle par défaut.

Mais avez-vous besoin d'ajouter un comportement spécifique à votre ListBox, parce que vous voulez en hériter? Si vous voulez juste ajouter le modèle d'élément spécifique, je ne recommanderais pas de dériver de ListBox (en fait, le DataTemplate n'est pas générique, il est toujours spécifique pour un DataType). Si vous n'ajoutez pas de comportement spécifique, je créerais un DataTemplate global (peut-être défini dans votre app.xaml) et je le référencerais en tant que DataTemplate chaque fois que vous en auriez besoin ou je créerais un style spécifique avec ce DataTemplate et définirais le style ListBox commun.

Si vous avez des questions, laissez un commentaire.

Espérons que cela aide!

BR,

TJ

1

Autre moyen de doIT, si vous voulez que votre contrôle recherche par défaut comme ListBox. Créez simplement une classe dérivée de ListBox, et sur le constructeur par défaut modifiez la DefaultStyleKey:

public class MyListBox : ListBox 
{ 
    public MyListBox() 
    { 
     // the control would look like a listBox by default 
     DefaultStyleKey = typeof (ListBox); 
    } 

    (...) 
} 
Questions connexes