ItemsControl的ItemTemplate使用DataTrigger,在列表中触发最后一个项目。

4

我有一个ItemsControl,其中定义了ItemTemplate。 ItemTemplate包含一个图像。 该图像具有样式触发器来设置图像。

如果该项是列表中的最后一项,我可以使用什么绑定来触发显示不同的图像?


1
请参考这里:https://dev59.com/nGfWa4cB1Zd3GeqPjbHk - Colin Smith
1个回答

3

虽然最简单的方法仍然是在VM /集合级别添加指示器字段,并在Trigger中引用该属性,但也有一些替代方案。

其中之一是使用ItemsControlAlternationCount。使用此方法将确保在更改源集合时(例如添加/删除/排序),最后一个项目的特殊样式得以保留。

  • 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();
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接