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 составляются? I понимают, что условия AND вместе, это скомпилировано в таким образом, чтобы была показана короткая резка?
Да, короткая резка представлена в 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
, так как первое условие успешно встречается.
Обратите внимание, что это НЕ НАСТОЯЩИЙ вопрос, основанный на мнениях, просто трудно найти окончательную информацию по этой конкретной теме. – slugster