列表框项目 WPF,不同项目的背景颜色不同
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20099694/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Listbox item WPF, different background color for different items
提问by mmvsbg
I have a WPF ListBox containing a binded list of items from a specific class that I have. Something like this:
我有一个 WPF ListBox,其中包含来自我拥有的特定类的绑定项目列表。像这样的东西:
ObservableCollection<MyTable> tables = new ObservableCollection<MyTable>();
...
listTables.ItemsSource = tables;
And the XAML:
和 XAML:
<ListBox HorizontalAlignment="Left" Margin="8,10,0,0" Name="listTables" Width="153" ItemsSource="{Binding tables}" SelectionChanged="listTables_SelectionChanged" Height="501" VerticalAlignment="Top">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="1">
<TextBlock Grid.Column="1" Text="{Binding tableName}" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
All works fine. What I want to do now is have a different background for each item in the ListBox depending on a certain property of the class. For example, let's say that the MyTable class has a property called isOccupied. If this flag is set for a certain item, I want it to have a red background in the ListBox, if it's not, then I want to have it with a green background. If the property changes, then the background should change accordingly.
一切正常。我现在想要做的是根据类的特定属性为 ListBox 中的每个项目设置不同的背景。例如,假设 MyTable 类有一个名为 isOccupied 的属性。如果为某个项目设置了此标志,我希望它在 ListBox 中具有红色背景,如果不是,那么我希望它具有绿色背景。如果属性更改,则背景应相应更改。
Any tips on how to achieve this? I'm looking up some information regarding ItemContainerStyle at the moment but I'm relatively new to this so I'm not sure if I'm following the right path.
有关如何实现这一目标的任何提示?我目前正在查找有关 ItemContainerStyle 的一些信息,但我对此比较陌生,所以我不确定我是否遵循正确的路径。
回答by Federico Berasategui
You can achieve that using DataTriggers
您可以使用s来实现DataTrigger
<ListBox.ItemTemplate>
<DataTemplate>
<!-- Step #1: give an x:Name to this Grid -->
<Grid Margin="1" x:Name="BackgroundGrid">
<TextBlock Grid.Column="1" Text="{Binding tableName}" />
</Grid>
<!-- Step #2: create a DataTrigger that sets the Background of the Grid, depending on the value of IsOccupied property in the Model -->
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsOccupied}" Value="True">
<Setter TargetName="BackgroundGrid" Property="Background" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsOccupied}" Value="False">
<Setter TargetName="BackgroundGrid" Property="Background" Value="Green"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.ItemTemplate>
Keep in mind that if you expect these values to change at runtime, your data item must properly implement and raise Property Change Notifications:
请记住,如果您希望这些值在运行时更改,您的数据项必须正确实现并引发属性更改通知:
public class MyTable: INotifyPropertyChanged //Side comment: revise your naming conventions, this is not a table.
{
private bool _isOccupied;
public bool IsOccupied
{
get { return _isOccupied; }
set
{
_isOccupied = value;
NotifyPropertyChange("IsOccupied");
}
}
//.. Other members here..
}
回答by eran otzap
<Style TargetType="ListBox" x:Key="myListBoxStyle">
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedItem.IsOccupied}" Value="True">
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>

