Использование ValueConverter в Style DataTrigger ItemsControl, но список пуст

Я пытаюсь использовать ValueConverter, чтобы перевернуть последний элемент в ItemsControl (чтобы он отображался в обратном направлении).

Для этого я создал стиль с помощью DataTrigger, который использует 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 возвращается ноль, и я не уверен, почему. Он устанавливается и отображается нормально (он просто никогда не переворачивается, как должен делать стиль).

Есть идеи по этому поводу? Спасибо!

2 ответа

Решение

Попробуйте заменить привязку на:

{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>
Другие вопросы по тегам