gpt4 book ai didi

c# - 更改列表框中一个列表项的背景(不是所选项目)

转载 作者:行者123 更新时间:2023-11-30 23:26:17 25 4
gpt4 key购买 nike

我有一个用于地址ListBox。每个项目都是使用 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,但这会占用一个更多的屏幕空间,所以我尽量避免这种情况。

更新 (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;
}
}
  • 可能需要将洋红色更改为不那么可怕的颜色;)

最佳答案

您需要使用 ItemContainerGenerator.ContainerFromIndex以此目的。它返回一个 DependencyObject,然后您可以将其转换为 ListBoxItem 并使用 ListBoxItem 的属性,例如 Background:

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

关于c# - 更改列表框中一个列表项的背景(不是所选项目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36924395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com