Я делал подобные вещи раньше, создав то, что я называю DataViewModel. Это в основном ViewModel для каждого элемента в коллекции. Я попробовал это быстро на вашем примере, и это сработало. Я вставлю весь свой код ниже, должен быть в состоянии вытащить его и выполнить, если хотите.
MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MainWindow_ViewModel/>
</Window.DataContext>
<StackPanel>
<TextBox Text="{Binding Pointer, Mode=TwoWay}" Height="20" Width="100"/>
<ListBox ItemsSource="{Binding MyDataHolder}" Height="20" Width="100">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Value}" Background="{Binding Color}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
MainWindow_ViewModel.cs
public class MainWindow_ViewModel
{
public MainWindow_ViewModel()
{
data = new DataHolder();
foreach (int value in data.Data)
{
myData.Add(new Data_DataViewModel() { Value = value });
}
this.Pointer = 4;
}
private DataHolder data;
private List<Data_DataViewModel> myData = new List<Data_DataViewModel>();
public List<Data_DataViewModel> MyDataHolder
{
get
{
return myData;
}
}
public int Pointer
{
get { return this.data.Pointer; }
set
{
this.data.Pointer = value;
foreach (Data_DataViewModel dvm in this.myData)
{
dvm.UpdateColor(this.data.Pointer);
}
}
}
}
DataHolder.cs
public class DataHolder
{
public List<int> Data
{
get { return data; }
}
private List<int> data = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
public int Pointer = 3;
}
Data_DataViewModel.cs
public class Data_DataViewModel : INotifyPropertyChanged
{
public int Value
{
get { return val; }
set { val = value; }
}
private int val;
public Brush Color
{
get
{
if (this.Value == pointer)
{
return Brushes.Gray;
}
else
{
return Brushes.Pink;
}
}
}
private int pointer;
public void UpdateColor(int pointerValue)
{
this.pointer = pointerValue;
OnPropertyChanged("Color");
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}