Использование 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>