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;)
Vous pouvez utiliser ItemContainerStyle. – Amine
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
L'élément est de type « Adresse ", donc il n'a pas la propriété" Background " – pStan