在 ItemsControl 的 ItemTemplate 中隐藏特定索引元素

问题描述

在我的 WPF/MVVM 应用程序中,我有一个带有 ItemTemplate 的 ListBox;我试图找出一种方法来隐藏模板中的特定元素,仅适用于列表中的第 0 项。首先,一些简化的样板:

<ListBox ItemsSource="{Binding MyItems}" AlternationCount="999999" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDeFinitions>
                    <ColumnDeFinition Width="*" />
                    <ColumnDeFinition Width="*" />
                </Grid.ColumnDeFinitions>

                <TextBlock Grid.Column="0" Text="{Binding Path=(ItemsControl.AlternationIndex),RelativeSource={RelativeSource AncestorType=ListBoxItem},StringFormat='{}{0}: '}" />
                <TextBlock Grid.Column="1" Text="{Binding Name}" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

现在假设我只想隐藏第 0 个项目的“名称”。理想情况下,我希望完全在 XAML 中完成此操作,因此我试图利用我经常使用的非常方便的扩展 CalcBinding,它允许您在 XAML 中编写计算绑定表达式(注意:它会自动在布尔值和您的可见性):

<Button Content="Cancel" Command="{Binding CancelCommand}" Visibility="{c:Binding 'Progresspercent > 0'}"/>

所以在这种情况下,我想到了类似的东西:

<a:EnumEditBox Visibility="{c:Binding Path='(ItemsControl.AlternationIndex) == 0',RelativeSource={RelativeSource AncestorType=ListBoxItem}}" />

然而,这种尝试和所有其他尝试似乎都会产生错误在这种情况下,错误是:BindingExpression path error: 'ItemsControl' property not found on 'object' ''ListBoxItem' (Name='')'. BindingExpression:Path=ItemsControl.AlternationIndex; DataItem='ListBoxItem' (Name=''); target element is 'EnumEditBox' (Name=''); target property is 'Visibility' (type 'Visibility')

所以我的问题是:

  1. 是否可以仅在 XAML 中执行我正在尝试的操作?
  2. 如果没有,我该如何实现(隐藏 ListBox 中索引为 0 的项目的元素)?

任何指针将不胜感激:)

解决方法

ItemTemplate 中的元素可以具有在 AlternationIndex 属性上带有 DataTrigger 的样式:

<ListBox.ItemTemplate>
    <DataTemplate>
        <Grid>
            ...
            <TextBlock Text="{Binding Name}">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Style.Triggers>
                            <DataTrigger
                                Binding="{Binding Path=(ItemsControl.AlternationIndex),RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
                                Value="0">
                                <Setter Property="Visibility" Value="Collapsed"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>