2016-04-28 4 views
1

J'ai un ListBox pour addresses. Chaque élément est une étiquette d'adresse formatée utilisant DataTemplate.Changer de fond sur un élément de liste dans une zone de liste (non l'élément sélectionné)

Lorsque l'utilisateur sélectionne un élément dans la liste ET clique sur le bouton Set to default, je souhaite changer la couleur de fond de cet élément pour indiquer la valeur par défaut.

Je veux seulement changer cet article, PAS le SelectedItem ... ainsi le SelectedItem pourrait être une couleur et le DÉFAUT pourrait être une couleur différente.

Je voudrais faire pragmatiquement ... même si je besoin d'une boucle pour réinitialiser le non-défaut et définir la valeur par défaut ...

Mon problème est que le seul ListBox.SelectedItem me permet d'accéder au sous-jacent objet dans la collection, dans ce cas Address.

Donc, ce qui suit ne fonctionnera pas:

foreach (ListBoxItem item in lstShipToAddresses.Items) 
{ 
    // does not work (can't cast Address to ListboxItem) 
    item.Background = Brushes.Magenta;   
} 

Comment puis-je accéder à l'arrière-plan d'un ListBoxItem particulier?

J'ai un plan B qui consiste à utiliser simplement une autre zone en dehors de la ListBox pour afficher la valeur par défaut address, mais cela gober un peu plus d'espace d'écran, donc je suis en train d'éviter cela.

Mise à jour (XAML):

<ListBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" 
     HorizontalAlignment="Stretch" 
     HorizontalContentAlignment="Stretch" 
     Name="lstShipToAddresses" 
     ItemsSource="{Binding Path=ocShipToAddress}" 
     SelectionChanged="lstShipToAddresses_SelectionChanged" 
     SelectedValuePath="Address_ID"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Border BorderBrush="#FF000000" BorderThickness="2,2,2,2" CornerRadius="10" HorizontalAlignment="Stretch" > 
       <Grid HorizontalAlignment="Stretch"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" /> 
        </Grid.ColumnDefinitions> 
        <StackPanel> 
         <TextBlock Grid.Row="0" Text="{Binding Path=Address_Label}" HorizontalAlignment="Stretch"></TextBlock> 
        </StackPanel> 
       </Grid> 
      </Border> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Solution finale:

Ce code se fait dans le bouton clic, de sorte que le SelectedItem est celui que nous voulons faire défaut.

for (int i = 0; i < lstShipToAddresses.Items.Count; i++) 
{ 
    if (lstShipToAddresses.Items[i] == lstShipToAddresses.SelectedItem) 
    { 
     // Set background on default 
     var listBoxItem = lstShipToAddresses.ItemContainerGenerator.ContainerFromIndex(i); 
     (listBoxItem as ListBoxItem).Background = Brushes.Magenta; 
    } 
    else 
    { 
     // Reset background on non-default 
     var listBoxItem = lstShipToAddresses.ItemContainerGenerator.ContainerFromIndex(i); 
     (listBoxItem as ListBoxItem).Background = Brushes.White; 
    } 
} 
  • pourrions avoir besoin de changer le magenta à une couleur moins effrayante;)
+0

Vous pouvez utiliser ItemContainerStyle. – Amine

+0

si vous avez fait ce qui suit au lieu de voir si elle change la couleur @pStan 'item.Background = new SolidColorBrush (Colors.Red);' alors si elle n'utilise votre 'Magenta' couleur – MethodMan

+0

L'élément est de type « Adresse ", donc il n'a pas la propriété" Background " – pStan

Répondre

1

Vous devez utiliser ItemContainerGenerator.ContainerFromIndex à cet effet. Il retourne un DependencyObject alors vous pouvez le jeter aux ListBoxItem et utiliser les propriétés de ListBoxItem comme Background:

for (int i = 0; i < lstShipToAddresses.Items.Count; i++) 
{ 
    var listBoxItem = lstShipToAddresses.ItemContainerGenerator.ContainerFromIndex(i); 
    (listBoxItem as ListBoxItem).Background = Brushes.Magenta; 
} 
+0

Merci pour la réponse approfondie. C'est ce dont j'ai besoin. – pStan

+0

@pStan ... Vous êtes les bienvenus. :) Aussi, je pense que si vous mettez à jour votre question et changez son titre en 'Impossible de lancer l'objet de type 'Adresse' pour taper 'System.Windows.Controls.ListBoxItem'.' vous aidera le futur visiteur à trouver votre question plus. –