0

我正在尝试使用 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;
    }
}

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

对此有什么想法吗?谢谢!

4

2 回答 2

1

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

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                               AncestorType=ContentPresenter, AncestorLevel=2},
                      Converter={StaticResource IsLastItemInContainerConverter}}"
             Value="True">
 .....
</DataTrigger>
于 2014-04-11T17:51:49.133 回答
1

尝试将您的绑定替换为:

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

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

于 2014-04-11T17:53:07.627 回答