我之前通过创建我称之为 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));
}
}
}