WPF - Como combinar DataTrigger e gatilho?
-
03-07-2019 - |
Pergunta
NOTA eu pedi a questão relacionada: como combinar DataTrigger e EventTrigger?
Eu tenho uma caixa de listagem que contém vários itens. implementos classe do item INotifyPropertyChanged
e tem um IsAvailable
propriedade. Eu uso essa propriedade para indicar opções indisponíveis na lista usando uma cor diferente.
No entanto, se um item selecionado não está disponível, então a cor de primeiro plano deve ser vermelho.
<ListBox>
<ListBox.Resources>
<DataTemplate DataType="{x:Type local:InstitutionViewModel}">
<TextBlock Name="Name" Text="{Binding Name}"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsAvailable}" Value="False">
<Setter TargetName="Name" Property="Foreground" Value="#888"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.Resources>
</ListBox>
Eu uso o gatilho dados acima para cinza para fora artigos indisponíveis.
O problema que estou enfrentando é que o fato de que o item é selecionado não tem nada a ver com os dados subjacentes a que o modelo está vinculado. O que eu realmente quero é algum tipo de multi-gatilho que suporta tanto a Trigger
regular em uma propriedade de dependência (ListBoxItem.IsSelected
) juntamente com uma DataTrigger
no item de dados vinculado.
Isso pode ser feito sem introduzir o conceito de seleção em meu modelo de vista?
Para qualquer um se perguntando por que eu faço itens indisponíveis não desativar, entendo que é uma exigência da aplicação que opções indisponíveis pode ser selecionado. Na verdade, existem algumas caixas de lista e seleção em um efeito que está disponível nos outros. Eu não posso desativar os itens que o usuário não seria capaz de mudar as suas mentes ou explorar diferentes combinações se os itens foram desativados com base em seleções anteriores.
Solução
Para qualquer um que é contra este problema, eu encontrei uma solução que funciona para mim. Claro, eu ainda estou interessado em ver outras respostas interessantes.
Aqui está o que eu fiz:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding
RelativeSource={
RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}},
Path=IsSelected}" Value="True"/>
<Condition Binding="{Binding IsAvailable}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter TargetName="Name" Property="Foreground" Value="#F00"/>
</MultiDataTrigger>
Não há nada especial sobre este ser um multi gatilho embora. Se você só queria o estilo do item selecionado de forma diferente em seu modelo de dados, você pode usar:
<DataTrigger Binding="{Binding
RelativeSource={
RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}},
Path=IsSelected}" Value="True">
<Setter TargetName="Name" Property="Foreground" Value="#888"/>
</DataTrigger>
Outras dicas
Para usá-lo com a mudança DataGridRow
modo de ligação a Self
:
Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=...