我有一个ItemsControl,其中定义了ItemTemplate。 ItemTemplate包含一个图像。 该图像具有样式触发器来设置图像。
如果该项是列表中的最后一项,我可以使用什么绑定来触发显示不同的图像?
我有一个ItemsControl,其中定义了ItemTemplate。 ItemTemplate包含一个图像。 该图像具有样式触发器来设置图像。
如果该项是列表中的最后一项,我可以使用什么绑定来触发显示不同的图像?
虽然最简单的方法仍然是在VM /集合级别添加指示器字段,并在Trigger
中引用该属性,但也有一些替代方案。
其中之一是使用ItemsControl
的AlternationCount
。使用此方法将确保在更改源集合时(例如添加/删除/排序),最后一个项目的特殊样式得以保留。
ItemsControl
中设置AlternationCount="{Binding Items.Count}"
(Items
是绑定到的集合)ItemTemplate
中检测最后一个项目的触发器,这有点复杂。XAML代码:
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource MyConverter}">
<Binding Path="(ItemsControl.AlternationIndex)"
RelativeSource="{RelativeSource FindAncestor,
AncestorType=ContentPresenter}" />
<Binding Path="ItemsSource.Count"
RelativeSource="{RelativeSource FindAncestor,
AncestorType=ItemsControl}" />
</MultiBinding>
</DataTrigger.Binding>
<!-- Change the following setter to what you need for new image -->
<Setter Property="Foreground"
Value="Tomato" />
</DataTrigger>
以及使用的转换器:
internal class MyConverter : IMultiValueConverter {
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
bool result;
try {
result = System.Convert.ToInt32(values[0]) == System.Convert.ToInt32(values[1]) - 1;
} catch (Exception) {
result = false;
}
return result;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) {
throw new NotImplementedException();
}
}