.net wpf triggers selection listboxitem

.net - WPF-¿Cómo combinar DataTrigger y Trigger?



triggers selection (2)

Para cualquier otra persona que se enfrente a este problema, encontré una solución que funciona para mí. Por supuesto, todavía estoy interesado en ver otras respuestas interesantes.

Esto es lo que hice:

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

Sin embargo, no hay nada especial en que esto sea un disparador múltiple. Si solo desea darle un estilo diferente al elemento seleccionado en su plantilla de datos, puede usar:

<DataTrigger Binding="{Binding RelativeSource={ RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True"> <Setter TargetName="Name" Property="Foreground" Value="#888"/> </DataTrigger>

NOTA He hecho la pregunta relacionada: ¿Cómo combinar DataTrigger y EventTrigger?

Tengo un cuadro de lista que contiene varios elementos. La clase del elemento implementa INotifyPropertyChanged y tiene una propiedad IsAvailable . Uso esa propiedad para indicar opciones no disponibles en la lista usando un color diferente.

Sin embargo, si un elemento seleccionado no está disponible, entonces el color de primer plano debe ser rojo.

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

Uso el disparador de datos anterior para atenuar los elementos no disponibles.

El problema al que me enfrento es que el hecho de que se seleccione el elemento no tiene nada que ver con los datos subyacentes a los que está vinculada la plantilla. Lo que realmente quiero es algún tipo de disparador múltiple que admita un Trigger regular en una propiedad de dependencia ( ListBoxItem.IsSelected ) junto con un DataTrigger en el elemento de datos vinculado.

¿Se puede hacer esto sin introducir el concepto de selección en mi modelo de vista?

Para cualquiera que se pregunte por qué no deshabilito los artículos no disponibles, entiendo que es un requisito de la aplicación que las opciones no disponibles puedan ser seleccionadas. En realidad, hay algunos cuadros de lista, y la selección en un solo efecto, lo que está disponible en los otros. No puedo deshabilitar los elementos, ya que el usuario no podría cambiar de opinión o explorar diferentes combinaciones si los elementos se deshabilitaron según las selecciones anteriores.


Para usarlo con DataGridRow cambie el modo de enlace a Self :

Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=...