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.

Foi útil?

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=... 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top