Triggers are evaluated from top to bottom。它适用于所有类型的触发器(Trigger、DataTrigger、MultiTrigger 和 MutliDataTrigger)。
多个 MultiDataTrigger 怎么样?它们是否短路了
第一个完全满足导致评估停止?或者是
如果几个满意,他们都评价最后一个获胜?
如上所述,触发器是从上到下评估的。因此,如果第一个满足所有条件并不意味着不会评估进一步的触发器。评估应用于更改属性的所有触发器,如果其中任何两个在触发器内设置相同的属性,则 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>
当IsEnable 评估为真时,文本将始终为Test2。
谁能权威地说明 MultiDataTriggers 是如何编译的?一世
了解条件是与在一起的,这是编译在
这样的捷径有特色吗?
是的,MultiDataTrigger 中具有捷径功能,即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 因为第一个条件成功满足。