我有一个ListBox,我想根据ListBox中前一个ListBoxItem的索引更改每个ListBoxItem的外观。
为了做到这一点,我创建了一个CustomListBoxItem,它继承自ListBoxItem并为它设置了一个Style。
Setters.Add(new Setter(ListBoxItem.ContentTemplateProperty, new CustomListBoxItemContentTemplate());
在继承自DataTemplate的CustomListBoxItemContentTemplate类的构造函数中,我有一个DataTrigger,如下所示:
DataTrigger dt = new DataTrigger();
dt.Binding = new Binding()
{
RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(CustomListBoxItem), 1),
Mode = BindingMode.OneWay,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
Converter = new CustomConverter()
};
dt.Value = true;
Triggers.Add(dt);
最后在CustomConverter类的Convert方法中,我实现了IValueConverter,如下所示:
var item = value as CustomBoxItem;
if (item == null)
return false;
/// I get the ItemsControl here
ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(item);
/// and the index of the CustomListBoxItem
int index = ic.ItemContainerGenerator.IndexFromContainer(item);
if (index == 0)
return true;
var previousItem = ic.ItemContainerGenerator.ContainerFromIndex(index - 1) as CustomListBoxItem;
/// ....
我应该说当ItemsSource绑定到源集合时,每件事情都完美无缺,但是当我向CustomListBox添加或删除项目时,DataTrigger不会重新评估整个项目。它仅适用于添加的项目。
我真的不知道问题是什么,或者说我的做法不是很好。
感谢任何帮助。非常感谢。