SourceName com MultiTriggers
-
06-07-2019 - |
Pergunta
É possível usar um MultiTrigger
para avaliar as propriedades em vários elementos? Que não residem dentro de um modelo, mas estão dentro do Usercontrol / janela.
Exemplo:
<CheckBox x:Name="checkBox1" />
<CheckBox x:Name="checkBox2" />
<CustomControl>
<CustomControl.ContentTemplate>
<DataTemplate>
<DataTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition
SourceName="checkBox1"
Property="IsChecked"
Value="False" />
<Condition
SourceName="checkBox2"
Property="IsChecked"
Value="True" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter
Property="Visibility"
Value="Collapsed" />
</MultiTrigger.Setters>
</MultiTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</CustomControl.ContentTemplate>
Em um Trigger
normal, podemos usar o sourceName para disparar contra propriedades em qualquer um desses controles de caixa de seleção, mas com um MultiTrigger
eu recebo erros de compilação quando se tenta encontrar esses controles.
Nota: A razão que eu estou usando um DataTemplate
em oposição a um Style
é mencionado aqui
Solução
Você pode realmente usar o nome de origem, mas que o seu DataTemplate não parece estar definida corretamente. Eu tentei preencher o seu exemplo que parece funcionar:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Grid>
<Grid.Resources>
<DataTemplate DataType="{x:Type sys:String}">
<StackPanel>
<TextBlock x:Name="textBlock" Text="{Binding}"></TextBlock>
<CheckBox x:Name="checkBox1" />
<CheckBox x:Name="checkBox2" />
</StackPanel>
<DataTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition
SourceName="checkBox1"
Property="IsChecked"
Value="False" />
<Condition
SourceName="checkBox2"
Property="IsChecked"
Value="True" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter
TargetName="textBlock"
Property="Visibility"
Value="Collapsed" />
</MultiTrigger.Setters>
</MultiTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Grid.Resources>
<ContentControl>
<sys:String>Foo</sys:String>
</ContentControl>
</Grid>
</Page>
O problema parece ser que você não definir seus CheckBoxes dentro o seu DataTemplate, que é onde eles precisam ser.