ItemsControl中Button绑定布尔属性修改样式失效问题求助
问题原因
ItemsControl的ItemContainerStyle是作用于容器元素(默认是ContentPresenter)的,而非你ItemTemplate里定义的Button。你在这个Style中设置Button.BorderBrush,本质是给ContentPresenter设置附加属性,但ContentPresenter不会自动将该属性传递给内部的Button,所以样式完全不生效。即使给Style添加TargetType="Button"也没用,因为ItemContainer的目标元素根本不是Button。
解决方案
方案一:将触发器移到Button的静态样式中(推荐)
直接修改你定义的ButtonStyle,把数据触发器添加到这个Style里,让触发器直接作用于Button本身:
<Style x:Key="ButtonStyle" TargetType="Button"> <!-- 保留你原有的Style设置,比如背景、字体等 --> <Style.Triggers> <DataTrigger Binding="{Binding Selected}" Value="True"> <Setter Property="BorderBrush" Value="Blue"/> </DataTrigger> <DataTrigger Binding="{Binding Selected}" Value="False"> <Setter Property="BorderBrush" Value="Red"/> </DataTrigger> </Style.Triggers> </Style>
之后可以完全删除ItemsControl.ItemContainerStyle节点,因为不需要再通过容器间接设置Button属性。
方案二:通过容器传递属性到Button
如果不想修改ButtonStyle,可以在ItemContainerStyle中设置容器的Tag属性,再让Button绑定这个Tag值:
<ItemsControl ItemsSource="{Binding MyList}"> <ItemsControl.ItemContainerStyle> <Style TargetType="ContentPresenter"> <Style.Triggers> <DataTrigger Binding="{Binding Selected}" Value="True"> <Setter Property="Tag" Value="Blue"/> </DataTrigger> <DataTrigger Binding="{Binding Selected}" Value="False"> <Setter Property="Tag" Value="Red"/> </DataTrigger> </Style.Triggers> </Style> </ItemsControl.ItemContainerStyle> <ItemsControl.ItemTemplate> <DataTemplate> <Button Style="{StaticResource ButtonStyle}" BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=ContentPresenter}, Path=Tag}"> <StackPanel Orientation="Horizontal"> <Image Style="{StaticResource ImageStyle}" Source="{Binding Icon}"/> <TextBlock Style="{StaticResource BrightText}" Text="{Binding Title}"/> </StackPanel> </Button> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>
方案三:改用ListBox实现选中逻辑
如果你的场景本身需要“选中项”的交互,可以替换成ListBox(它自带选中机制),将你的Selected属性与ListBoxItem.IsSelected绑定:
<ListBox ItemsSource="{Binding MyList}" SelectionMode="Single"> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <!-- 将数据模型的Selected属性绑定到ListBoxItem的IsSelected --> <Setter Property="IsSelected" Value="{Binding Selected}"/> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="BorderBrush" Value="Blue"/> </Trigger> <Trigger Property="IsSelected" Value="False"> <Setter Property="BorderBrush" Value="Red"/> </Trigger> </Style.Triggers> </Style> </ListBox.ItemContainerStyle> <ListBox.ItemTemplate> <DataTemplate> <Button Style="{StaticResource ButtonStyle}"> <StackPanel Orientation="Horizontal"> <Image Style="{StaticResource ImageStyle}" Source="{Binding Icon}"/> <TextBlock Style="{StaticResource BrightText}" Text="{Binding Title}"/> </StackPanel> </Button> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
内容的提问来源于stack exchange,提问作者Filip Zaťko
相关产品推荐
相关产品推荐

