在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;
}
}
虽然item
是ItemsControl
中的一个有效元素,但对ItemsControl.ItemsControlFromItemContainer
的调用返回null,我不知道为什么。它正在设置中,并且显示良好(只是它永远不会像样式应该引起的那样翻转)。
对此有什么想法吗?谢谢
尝试将绑定替换为:
{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>