Triggers are evaluated from top to bottom
. 它适用于所有类型的触发器(Trigger、DataTrigger、MultiTrigger 和 MutliDataTrigger)。
多个 MultiDataTriggers 呢?它们是否短路以使第一个完全满足导致评估停止?或者如果有几个都满意,他们都评价为最后一个获胜?
如前所述,触发器是从上到下评估的。因此,如果第一个满足所有条件并不意味着不会评估进一步的触发器。评估应用于更改属性的所有触发器,如果它们中的任何两个在触发器内设置相同的属性,则last trigger always won
和overrides the property set by first trigger
。
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding IsEnable}" Value="True">
<Setter Property="Text" Value="Test1"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsEnable}" Value="True">
<Setter Property="Text" Value="Test2"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Test2
当IsEnable
评估结果为真时,文本将始终存在。
谁能权威地说明 MultiDataTriggers 是如何编译的?我知道条件是 ANDed 在一起的,这是否是以捷径为特色的方式编译的?
是的,MultiDataTrigger 中具有捷径功能,即 if first condition evaluate to be false, second condition won't be checked
. 此示例验证了这一点 -
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsEnable,
Converter={StaticResource SingleValueConverter}}"
Value="True"/>
<Condition Binding="{Binding IsEnable,
Converter={StaticResource SingleValueConverter}}"
Value="True"/>
</MultiDataTrigger.Conditions>
<Setter Property="Text" Value="Test"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
在这两种情况下都应用了转换器,但如果IsEnabled
是false
,converter gets hit only once
因为第一个条件评估为假。但万一IsEnabled
是true
,converter gets hit twice
因为第一个条件成功满足。