WPF触发器的多种写法

XML 复制代码
<ItemsControl ItemsSource="{Binding Starts}" AlternationCount="2">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border x:Name="border" Padding="5">
                <Border.Style>
                    <Style TargetType="Border">

                     <!-- 这里定义样式触发器 -->
                        
                    </Style>
                </Border.Style>
                <TextBlock Text="{Binding}"></TextBlock>
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

背景:就在上面的触发器样式定义过程中,发现绑定的写法可以有很多种

首先可以使用TemplatedParent进行绑定

XML 复制代码
<Style.Triggers>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=(ItemsControl.AlternationIndex)}" Value="1">
        <Setter Property="Background" Value="LightGray"/>
    </DataTrigger>
    <!--<DataTrigger Binding="{Binding ItemsControl.AlternationIndex, RelativeSource={RelativeSource TemplatedParent}}" Value="1">
        <Setter Property="Background" Value="LightGray"/>
    </DataTrigger>-->
</Style.Triggers>

那么问题就来了,注释的写法好像在其它情况下也是可以的啊,但是就是没有效果,为什么呢?

它们的绑定上下文都是'ItemsControl'的每个子项(RelateiveSource指的是当前 DataTemplate 的模板父控件,即 ItemsControl 的每个子项。在这种情况下,它实际上是指向由 ItemsControl.ItemTemplate 生成的每个子项的容器(通常是一个 ContentPresenter)); Path就是要访问ItemsControl每个子项容器的AlternationIndex属性。
错的原因可能是绑定表达式的格式不同绑定的引擎就无法正确的解析和定位,就是要使用第一种写法才是正规的。
Path后面的括号也是很重要,没有就会绑定不上

那么为什么不直接使用属性和值呢?

XML 复制代码
<Style.Triggers>
    <Trigger Property="ItemsControl.AlternationIndex" Value="1">
        <Setter Property="Background" Value="LightGray"/>
    </Trigger>
</Style.Triggers>

这里的上下文是Border,不是ItemsControl的子项,绑定不到属性中的

还可以使用FindAncestor进行绑定

XML 复制代码
<Style.Triggers>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}" Value="1">
        <Setter Property="Background" Value="LightGray"/>
    </DataTrigger>
</Style.Triggers>

-- 这个对比Mode是TemplatedParent的写法是简写,TemplatedParent是没有简写的

也可以在数据模板DataTemplate中定义触发器,而不是Style中

XML 复制代码
<DataTemplate.Triggers>
    <Trigger Property="ItemsControl.AlternationIndex" Value="1">
        <Setter TargetName="border" Property="Background" Value="lightgray"></Setter>
    </Trigger>
</DataTemplate.Triggers>
相关推荐
听麟5 小时前
HarmonyOS 6.0+ 跨端智慧政务服务平台开发实战:多端协同办理与电子证照管理落地
笔记·华为·wpf·音视频·harmonyos·政务
听麟8 小时前
HarmonyOS 6.0+ APP AR文旅导览系统开发实战:空间定位与文物交互落地
人工智能·深度学习·华为·ar·wpf·harmonyos
聆风吟º1 天前
CANN hccl 深度解析:异构计算集群通信库的跨节点通信与资源管控实现逻辑
人工智能·wpf·transformer·cann
无心水1 天前
分布式定时任务与SELECT FOR UPDATE:从致命陷阱到优雅解决方案(实战案例+架构演进)
服务器·人工智能·分布式·后端·spring·架构·wpf
LZL_SQ1 天前
HCCL测试框架中AllReduce边界条件测试设计深度剖析
wpf·cann
User_芊芊君子2 天前
【分布式训练】CANN SHMEM跨设备内存通信库:构建高效多机多卡训练的关键组件
分布式·深度学习·神经网络·wpf
就是有点傻3 天前
WPF按钮走马灯效果
wpf
zuozewei3 天前
虚拟电厂聚合商平台安全技术体系深度解读
安全·wpf
极客智造3 天前
WPF 自定义控件:AutoGrid 实现灵活自动布局的网格控件
wpf
极客智造3 天前
WPF Grid 布局高效扩展:GridHelpers 附加属性工具类全解析
wpf