WPF触发器的多种写法

<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进行绑定

<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后面的括号也是很重要,没有就会绑定不上

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

<Style.Triggers>
    <Trigger Property="ItemsControl.AlternationIndex" Value="1">
        <Setter Property="Background" Value="LightGray"/>
    </Trigger>
</Style.Triggers>

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

还可以使用FindAncestor进行绑定

<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中

<DataTemplate.Triggers>
    <Trigger Property="ItemsControl.AlternationIndex" Value="1">
        <Setter TargetName="border" Property="Background" Value="lightgray"></Setter>
    </Trigger>
</DataTemplate.Triggers>

相关推荐

  1. WPF触发器多种写法

    2024-01-10 01:06:01       65 阅读
  2. WPF 触发器

    2024-01-10 01:06:01       40 阅读
  3. 单例模式多种写法

    2024-01-10 01:06:01       39 阅读
  4. WPF 基础入门 (触发器

    2024-01-10 01:06:01       59 阅读
  5. WPF触发器与模板

    2024-01-10 01:06:01       37 阅读
  6. WPF EventSetter 写法

    2024-01-10 01:06:01       25 阅读
  7. WPF中Image控件Source多种指定方式

    2024-01-10 01:06:01       48 阅读
  8. WPF 中 样式触发器机制 Style.Triggers

    2024-01-10 01:06:01       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-10 01:06:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-10 01:06:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-10 01:06:01       82 阅读
  4. Python语言-面向对象

    2024-01-10 01:06:01       91 阅读

热门阅读

  1. LeetCode 2707. 字符串中的额外字符

    2024-01-10 01:06:01       60 阅读
  2. 【OCR】 - Tesseract OCR在mac系统中安装

    2024-01-10 01:06:01       57 阅读
  3. 【Spark精讲】SparkSQL Join选择逻辑

    2024-01-10 01:06:01       41 阅读
  4. C++之模板类template

    2024-01-10 01:06:01       44 阅读
  5. 2024年湖北建设厅建筑七大员怎么报考?

    2024-01-10 01:06:01       56 阅读
  6. Linux 编辑器和文本处理

    2024-01-10 01:06:01       49 阅读
  7. 面试题总结(1.8)

    2024-01-10 01:06:01       42 阅读
  8. C#,C++实现:华为经典笔试题_菜单组合种类题目

    2024-01-10 01:06:01       48 阅读
  9. arch modelsim 解决无法运行

    2024-01-10 01:06:01       55 阅读
  10. 算法学习:动态规划之爬楼梯问题

    2024-01-10 01:06:01       60 阅读
  11. 学习Go语言Web框架Gee总结--中间件Middleware(五)

    2024-01-10 01:06:01       73 阅读