C# 更改列表框中一个列表项(不是选定项)的背景

C# 更改列表框中一个列表项(不是选定项)的背景,c#,wpf,listbox,listboxitem,C#,Wpf,Listbox,Listboxitem,我有一个列表框用于地址。每个项目都是使用DataTemplate格式化的地址标签 当用户在列表中选择一个项目并单击“设置为默认值”按钮时,我想更改该项目的背景色以表示默认值 我只想更改这一项,而不是SelectedItem。。。因此,SelectedItem可能是一种颜色,而默认值可能是另一种颜色 我想务实地做这件事。。。即使我需要一个循环来重置非默认值并设置默认值 我的问题是列表框.SelectedItem只允许我访问集合中的底层对象,在本例中是地址 因此,以下措施行不通: foreach (

我有一个
列表框
用于
地址
。每个项目都是使用
DataTemplate
格式化的地址标签

当用户在列表中选择一个项目并单击“设置为默认值”按钮时,我想更改该项目的背景色以表示默认值

我只想更改这一项,而不是
SelectedItem
。。。因此,
SelectedItem
可能是一种颜色,而默认值可能是另一种颜色

我想务实地做这件事。。。即使我需要一个循环来重置非默认值并设置默认值

我的问题是
列表框.SelectedItem
只允许我访问集合中的底层对象,在本例中是
地址

因此,以下措施行不通:

foreach (ListBoxItem item in lstShipToAddresses.Items)
{
   // does not work (can't cast Address to ListboxItem) 
   item.Background = Brushes.Magenta;        
}
如何访问特定的
ListBoxItem
的背景

我有一个计划
B
,它只需要使用
列表框
之外的另一个区域来显示默认的
地址
,但这会占用更多的屏幕空间,所以我尽量避免这样做

更新(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>
  • 可能需要将洋红色改为不那么吓人的颜色;)
您需要为此目的使用。它返回一个
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; 
}
for(int i=0;i
您可以使用ItemContainerStyle。如果您改为执行以下操作以查看它是否会更改颜色@pStan
item.Background=new SolidColorBrush(Colors.Red)
那么如果它确实使用了您的
洋红
颜色,则该项的类型为“Address”,因此它没有属性“Background”@pStan…您可以显示您的XAML吗?您需要一个属性,例如Background或IsDefault…感谢您的详细回答。这就是我需要的。@pStan……不客气。:)此外,我认为如果您更新您的问题并将其标题更改为
无法将类型为“Address”的对象强制转换为类型为“System.Windows.Controls.ListBoxItem”。
您将帮助未来的访问者找到更多您的问题。
for (int i = 0; i < lstShipToAddresses.Items.Count; i++)
{
    var listBoxItem = lstShipToAddresses.ItemContainerGenerator.ContainerFromIndex(i);
    (listBoxItem as ListBoxItem).Background = Brushes.Magenta; 
}