У меня есть ListBox
для addresses
. Каждый элемент является форматированной меткой адреса, используя DataTemplate
.Изменить фон на один элемент списка в списке (Не выбранный элемент)
Когда пользователь выбирает элемент в списке и нажимает кнопку Set to default
, я хотел бы изменить цвет фона этого элемента, чтобы обозначить значение по умолчанию.
Я хочу изменить только один элемент, а не SelectedItem
... так что SelectedItem
может быть одного цвета, а DEFAULT может быть другого цвета.
Я хотел бы сделать это прагматично ... даже если мне нужен цикл, чтобы сбросить не по умолчанию и установить по умолчанию ...
Моя проблема заключается в том, что ListBox.SelectedItem
только позволяет мне доступ к основной объект в коллекции, в данном случае Address
.
Итак, следующий не будет работать:
foreach (ListBoxItem item in lstShipToAddresses.Items)
{
// does not work (can't cast Address to ListboxItem)
item.Background = Brushes.Magenta;
}
Как я могу получить доступ на фоне определенного ListBoxItem
?
У меня есть план B
который включает в себя только с помощью другой области за пределами ListBox
для отображения по умолчанию address
, но что бы сожрать немного больше места на экране с, так что я пытаюсь избежать этого.
Update (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>
Окончательное решение:
Этот код выполняется в пределах нажатием кнопки, так что SelectedItem
является тот, который мы хотим сделать по умолчанию.
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;
}
}
- Может потребоваться изменить Magenta к менее пугающей цвет;)
Вы можете использовать ItemContainerStyle. – Amine
Что делать, если вы сделали следующее, чтобы увидеть, изменит ли он цвет @pStan 'item.Background = new SolidColorBrush (Colors.Red);' тогда, если он использует ваш цвет Magenta – MethodMan
Элемент имеет тип «Адрес ", поэтому у него нет свойства« Фон » – pStan