wpf - (多个)MultiDataTrigger 与转换器的效率

标签 wpf binding valueconverter multidatatrigger

我目前正在分析一些使用广泛使用 MultiDataTriggers 的样式的 XAML。 (每种样式 8-10 个多数据触发器,每个触发器有 4-6 个条件)。当看到这个时,我正在考虑使用 converter 是否会更有效。 (或 multi value converter ),特别是当 MultiDataTriggers 无法调试时。

任何人都可以权威地说明 MultiDataTriggers 是如何编译的吗?据我了解,Conditions are ANDed综合起来,这个编译方式是不是有短路的特点?

多个 MultiDataTriggers 怎么样?它们是否短路,导致第一个完全满足导致评估停止?还是都评价,如果几个都满意,最后一个获胜?

最佳答案

触发器是从上到下评估的。它适用于所有类型的触发器(Trigger、DataTrigger、MultiTrigger 和 MutliDataTrigger)。

What about multiple MultiDataTriggers? Are they short circuited so that the first one fully satisfied causes evaluation to stop? Or are they all evaluated with the last one winning if several are satisfied?

如上所述,触发器是从上到下评估的。因此,如果第一个触发器满足所有条件并不意味着不会评估进一步的触发器。评估应用于已更改属性的所有触发器,如果​​其中任何两个在触发器内设置相同的属性,则最后一个触发器始终获胜覆盖第一个触发器设置的属性

<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 计算结果为 true 时,文本将始终为 Test2

<小时/>

Can anyone authoritatively state how MultiDataTriggers are compiled? I understand that the Conditions are ANDed together, is this compiled in such a way that short cutting is featured?

是的,MultiDataTrigger 中具有捷径功能,即如果第一个条件评估为 false,则不会检查第二个条件。此示例验证了这一点 -

<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>

在这两种情况下都会应用转换器,但如果 IsEnabledfalse转换器只会命中一次,因为第一个条件的计算结果为错误的。但如果 IsEnabledtrue,由于成功满足第一个条件,转换器会被命中两次

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

相关文章:

wpf - 如何对齐WPF扩展器控件切换按钮

c# - 以编程方式访问 WPF 控件

c# - 值转换器。强制 WPF 只调用一次

wpf - 将文本 block 绑定(bind)到纯 xaml 中的当前列表框项目

c# - WPF.NET : OpenSubkey() don't find value in registry

c# - 将两个属性绑定(bind)到 ==> 单个控件

wpf - 通过 XAML 中的样式 && 触发器绑定(bind)窗口标题

从 ItemsControl 派生的 WPF 自定义控件无法显示绑定(bind)数据

java - 如何将字符串转换为 float ?

mysql - 将值转换为前 10 名