我目前正在分析一些XAML,这些XAML使用的样式广泛使用了MultiDataTriggers(每个样式8-10个多数据触发器,每个触发器4-6个条件)。在查看此内容时,我正在考虑使用converter(或multi value converter)是否会更有效,尤其是因为无法调试MultiDataTriggers时。
谁能权威地说明MultiDataTriggers的编译方式?我知道Conditions are ANDed在一起,是否以快捷方式为特色进行编译?
多个MultiDataTriggers呢?它们是否短路,以使第一个完全满足要求而导致评估停止?还是如果几个人满意,他们是否都用最后一个获胜者来评估?
最佳答案
Triggers are evaluated from top to bottom
。它适用于各种触发器(Trigger,DataTrigger,MultiTrigger和MutliDataTrigger)。
如上所述,触发器是从上到下进行评估的。因此,如果第一个条件满足所有条件并不意味着不会评估其他触发器。评估应用于更改属性的所有触发器,如果其中任何两个触发器在触发器内设置相同的属性,则为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
评估为true时,文本将始终为IsEnable
。是的,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
。关于wpf - (多个)MultiDataTrigger与转换器的效率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19888983/