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>