在ItemsControl的Style DataTrigger中使用ValueConverter,但列表为空

本文关键字:ValueConverter 列表 ItemsControl Style DataTrigger | 更新日期: 2023-09-27 17:58:07

我正试图使用ValueConverter翻转ItemsControl中的最后一个项(使其向后显示)。

为了实现这一点,我创建了一个带有DataTrigger的Style,它使用ValueConverter来检查当前项是否是列表中的最后一项。

<UserControl.Resources>
  <local:FIsLastItemInContainerConverter x:Key="IsLastItemInContainerConverter"/>
</UserControl.Resources>
<StackPanel>
  <ItemsControl ItemsSource="{Binding Path=ActiveAction.ActionIconDatas}">
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <DataTemplate.Resources>
          <Style TargetType="local:FActionInfoControl">
            <Style.Triggers>
              <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource IsLastItemInContainerConverter}}" Value="True">
                <Setter Property="RenderTransformOrigin" Value="0.5 0.5"/>
                <Setter Property="RenderTransform">
                  <Setter.Value>
                    <TransformGroup>
                      <ScaleTransform ScaleX="-1"/>
                    </TransformGroup>
                  </Setter.Value>
                </Setter>
              </DataTrigger>
            </Style.Triggers>
          </Style>
        </DataTemplate.Resources>
        <ContentControl>
          <local:FActionInfoControl/>
        </ContentControl>
      </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <StackPanel Orientation="Horizontal"/>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
  </ItemsControl>
</StackPanel>

问题似乎出在我的ValueConverter上。

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    DependencyObject item = (DependencyObject)value;
    // THIS IS RETURNING NULL
    ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(item);
    if (ic == null)
    {
        return false;
    }
    else
    {
        return ic.ItemContainerGenerator.IndexFromContainer(item) == ic.Items.Count - 1;
    }
}

虽然itemItemsControl中的一个有效元素,但对ItemsControl.ItemsControlFromItemContainer的调用返回null,我不知道为什么。它正在设置中,并且显示良好(只是它永远不会像样式应该引起的那样翻转)。

对此有什么想法吗?谢谢

在ItemsControl的Style DataTrigger中使用ValueConverter,但列表为空

尝试将绑定替换为:

{Binding RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}, AncestorLevel=2}, Converter={StaticResource IsLastItemInContainerConverter}}

实际上ItemsControl.ItemsControlFromItemContainer()只返回实际项容器的父ItemsControl。在您的案例中,ContentPresenter是使用简单ItemsControl时的容器类型。但是,当您在数据模板的ContentControl中封装您的时,指定AncestorLevel=2也很重要。

您正在将local:FActionInfoControl传递到转换器,该转换器不是ItemsControl的容器。您需要传递容器,即ContentPresenter,您可以使用FindAncestor获得该容器。

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                               AncestorType=ContentPresenter, AncestorLevel=2},
                      Converter={StaticResource IsLastItemInContainerConverter}}"
             Value="True">
 .....
</DataTrigger>