我目前正在分析一些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 wonoverrides 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>

在这两种情况下都将应用转换器,但在IsEnabledfalseconverter gets hit only once的情况下,因为第一个条件得出的结果为假。但是如果IsEnabledtrue,则成功满足第一个条件以来的converter gets hit twice

关于wpf - (多个)MultiDataTrigger与转换器的效率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19888983/

10-09 10:13