I have this XAML:
Setting the background of a ListViewItem directly is not a good idea because by default a ListView is virtualizing (which is good), that means the controls that make up the items get disposed when scrolled out of view. The easiest way to do this is that i can think of is having a property in your data-object which indicates the New-state, then you can trigger on it.
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsNew}" Value="True">
<Setter Property="Background" Value="Yellow"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
You then can use any logic you want to set that value to false again if you do not consider it new anymore.
You can subscribe to the ItemsChanged event on your listbox.Items property. This is a little tricky because you have to cast it first. The code to subscribe would look like this:
((INotifyCollectionChanged)MainListBox.Items).CollectionChanged += ListBox_CollectionChanged;
And then inside that event you can get to your item with code like this:
private void ListBox_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems.Count > 0)
{
Dispatcher.BeginInvoke(() =>
{
var newListItem = MainListBox.ItemContainerGenerator.ContainerFromItem(e.NewItems[0]) as Control;
if (newListItem != null)
{
newListItem.Background = System.Windows.Media.Brushes.Red;
}
}, DispatcherPriority.SystemIdle);
}
}