Элемент списка WPF, другой цвет фона для разных элементов
у меня есть список WPF, содержащий привязанный список элементов из определенного класса, который у меня есть. Что-то вроде этого:--3-->
ObservableCollection<MyTable> tables = new ObservableCollection<MyTable>();
...
listTables.ItemsSource = tables;
и 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>
все работает нормально. Теперь я хочу иметь другой фон для каждого элемента в списке в зависимости от определенного свойства класса. Например, предположим, что класс MyTable имеет свойство isoccupied. Если этот флаг установлен для определенного элемента, я хочу, чтобы он имел красный фон в ListBox, если это не так, то я хочу иметь его с зеленым фоном. Если свойство изменяется, то фон должен измениться соответствующим образом.
любые советы о том, как этого добиться? Я ищу некоторую информацию о ItemContainerStyle на данный момент, но я относительно новичок в этом, поэтому я не уверен, что я следую правильному пути.
2 ответов
вы можете добиться этого, используя DataTrigger
s
<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>
имейте в виду, что если вы ожидаете, что эти значения изменить во время выполнения, ваш элемент данных должен правильно реализовать и поднять Уведомления Об Изменении Свойств:
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..
}
<Style TargetType="ListBox" x:Key="myListBoxStyle">
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedItem.IsOccupied}" Value="True">
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>