在 ItemsControl ItemTemplate 中隐藏特定索引元素
Hiding A Specific-Indexed Element In An ItemsControl's ItemTemplate
在我的 WPF/MVVM 应用程序中,我有一个带有 ItemTemplate 的列表框;我试图找出一种方法来隐藏模板中的特定元素,仅针对列表中的第 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')
所以我的问题是:
- 是否可以仅在 XAML 中完成我正在尝试的操作?
- 如果不是,我该如何完成此操作(隐藏 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>
在我的 WPF/MVVM 应用程序中,我有一个带有 ItemTemplate 的列表框;我试图找出一种方法来隐藏模板中的特定元素,仅针对列表中的第 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')
所以我的问题是:
- 是否可以仅在 XAML 中完成我正在尝试的操作?
- 如果不是,我该如何完成此操作(隐藏 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>