2008-09-30 8 views
2

Comment définir la couleur d'arrière-plan des éléments d'une zone de liste de façon dynamique? c'est-à-dire qu'il y a une propriété sur mon objet métier que je lie également, donc en fonction de certaines règles métier, je veux que la couleur d'arrière-plan soit différente?Définition dynamique de la couleur d'arrière-plan d'un contrôle Silverlight (Zone de liste)

 <ListBox Background="Red"> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="ListBoxItem"> 
       <Setter Property="Background" Value="Red"/> 
      </Style> 
     </ListBox.ItemContainerStyle> 
<ListBox.ItemTemplate> 
     <DataTemplate> 
        <StackPanel Orientation="Horizontal" 
           Margin="5"> 
         <TextBlock VerticalAlignment="Bottom" 
            FontFamily="Comic Sans MS" 
            FontSize="12" 
            Width="70" 
            Text="{Binding Name}" /> 
         <TextBlock VerticalAlignment="Bottom" 
            FontFamily="Comic Sans MS" 
            FontSize="12" 
            Width="70" 
            Text="{Binding Age}" /> 
        </StackPanel> 
       </DataTemplate> 
     </ListBox.ItemTemplate> 
     </ListBox> 

EDIT: Il dit here

Dans Silverlight, vous devez ajouter x: attributs clés à vos styles personnalisés et les référencer des ressources statiques. Silverlight ne prend pas en charge les styles implicites appliqués à l'aide de la valeur d'attribut TargetType .

Est-ce que cela a une incidence sur mon approche?

Répondre

0

@Matt Merci pour la réponse. Je vais regarder dans les déclencheurs. Mon seul problème est que la logique pour déterminer si une ligne doit être colorée est légèrement plus impliquée, donc je ne peux pas vérifier une propriété, donc j'ai besoin de faire un peu de logique pour déterminer la couleur. Des idées?

Je suppose que je pourrais faire un objet d'interface utilisateur avec tous les champs dont j'ai besoin, mais je ne voulais pas prendre l'approche.

2

Ok - si vous avez besoin d'une logique personnalisée pour déterminer l'arrière-plan, alors je chercherais à construire une classe IValueConverter simple. Vous avez juste besoin d'implémenter l'interface IValueConverter et, dans sa méthode Convert, changer la valeur fournie dans un pinceau.

Voici un petit post de Sahil Malik qui décrit IValueConverters - il pourrait aider:

http://blah.winsmarts.com/2007-3-WPF__DataBinding_to_Calculated_Values--The_IValueConverter_interface.aspx

1

Pour lier votre arrière-plan à plus d'une propriété, vous pouvez utiliser IMultiValueConverter. C'est comme IValueConverter, sauf qu'il fonctionne avec MultiBinding pour passer plus d'une valeur dans une classe et récupérer une seule valeur.

Voici un message que j'ai trouvé une exécution par le IMultiValueConverter et MultiBinding:

http://blog.paranoidferret.com/index.php/2008/07/21/wpf-tutorial-using-multibindings/

Edit: Si IMultiValueConverter n'est pas disponible (il semble que Silverlight n'a IValueConverter), vous pouvez toujours passer l'ensemble de votre objet lié (par exemple votre objet Personne) à un IValueConverter et utilisez différentes propriétés de celle-ci pour renvoyer votre pinceau.

0

Vous pourriez essayer de lier quelque chose dans votre controltemplate (c'est-à-dire une bordure ou quelque chose) au TemplateBackground. Ensuite, définissez l'arrière-plan sur votre liste pour déterminer la couleur qu'il sera.

<Border Margin="-2,-2,-2,0" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" CornerRadius="11,11,0,0"> 
Questions connexes