WPF如何仅隐藏ListBox指定索引项ItemTemplate内的元素
问题1:该需求可以完全通过XAML实现
你遇到的报错是CalcBinding对附加属性的语法解析规则和原生WPF绑定不同导致的,原生XAML不依赖第三方扩展就可以实现需求,推荐用DataTrigger方案:
<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}: '}" /> <!-- 给要隐藏的元素加x:Name --> <TextBlock x:Name="NameField" Grid.Column="1" Text="{Binding Name}" /> </Grid> <!-- 加DataTemplate触发器 --> <DataTemplate.Triggers> <DataTrigger Binding="{Binding Path=(ItemsControl.AlternationIndex), RelativeSource={RelativeSource AncestorType=ListBoxItem}}" Value="0"> <Setter TargetName="NameField" Property="Visibility" Value="Collapsed"/> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
如果一定要用CalcBinding实现,需要把附加属性单独作为参数传入,避免CalcBinding解析括号的时候出错:
<a:EnumEditBox Visibility="{c:Binding 'Index == 0', Index={Binding Path=(ItemsControl.AlternationIndex), RelativeSource={RelativeSource AncestorType=ListBoxItem}}}" />
问题2:非纯XAML的可选方案
如果不限制纯XAML实现,还有两种常用方案:
- 模型扩展方案:给
MyItems对应的条目模型加IsFirst布尔属性,在ViewModel初始化集合的时候将第一个元素的IsFirst设为True,其余为False,直接绑定该属性到元素的Visibility即可,配合BooleanToVisibilityConverter使用。 - 值转换器方案:实现
IValueConverter,输入值为AlternationIndex,当值为0时返回Visibility.Collapsed,其余返回Visibility.Visible,在绑定中直接调用转换器即可。
内容的提问来源于stack exchange,提问作者J23
相关产品推荐
相关产品推荐

