[Original]
Tengo un ListBox
que tiene su ItemsSource
(esto se hace en el código detrás de como se crea la ventana) de enlace de datos a un ObservableCollection
. El ListBox
tiene entonces la siguiente DataTemplate
asignado en contra de los artículos:DataTrigger no volver a evaluar después de la propiedad cambia
usercontrol.xaml
<ListBox x:Name="communicatorListPhoneControls"
ItemContainerStyle="{StaticResource templateForCalls}"/>
App.xaml
<Style x:Key="templateForCalls" TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate" Value="{StaticResource templateRinging}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=hasBeenAnswered}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource templateAnswered}"/>
</DataTrigger>
</Style.Triggers>
</Setter>
</Style>
Cuando el ObservableCollection
se actualiza con un objeto, éste aparece en la ListBox
con la inicial correcta DataTemplate
, sin embargo, cuando la propiedad hasBeenAnswered
se establece en true
(cuando la depuración puedo ver la colección es correcta) el DataTrigger
no vuelve a evaluar y luego actualiza el ListBox
para usar el DataTemplate
correcto.
He implementado el evento INotifyPropertyChanged
en mi objeto, y si en la plantilla está vinculado a un valor, puedo ver la actualización del valor. Es solo que el DataTrigger
no volverá a evaluar y cambiar a la plantilla correcta.
sé la unión DataTrigger
es correcto porque si cierro la ventana y la abro de nuevo, correctamente se aplicará la segunda DataTemplate, debido a que el hasBeenAnswered
se establece en true
.
[editar 1]
A raíz de los comentarios realizados por Timores He intentado lo siguiente:
usercontrol.xaml
<ListBox x:Name="communicatorListPhoneControls"
ItemTemplate="{StaticResource communicatorCallTemplate}"/>`
App.xaml:
<DataTemplate x:Key="communicatorCallTemplate">
<Label x:Name="test">Not answered</Label>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=hasBeenAnswered}" Value="True">
<Setter TargetName="test" Property="Background" Value="Blue"/>
</DataTrigger>
</DataTemplate.Triggers>
</Label>
</DataTemplate>
Lo que sucede ahora es similar al primer ejemplo, cuando aparece una llamada en la etiqueta "No contestado" (uno por llamada que existe ya que este es un cuadro de lista, normalmente cuando la ventana se carga no habrá llamadas), la llamada se responde y el valor hasBeenAnswered
se establece en verdadero, pero el "Sin respuesta" sigue siendo el mismo. Si cierro la ventana y la vuelvo a abrir (con la llamada activa aún con la propiedad hasBeenAnswered establecida en verdadero), el fondo es azul. Entonces me parece que el datatrigger simplemente no se está ejecutando, hasta que se vuelva a ejecutar la ventana.
He intentado implementar esto, pero aún se aplica solo si cierro la ventana y la vuelvo a abrir. Voy a enmendar el comentario inicial para mostrar esto. ¿Tienes alguna idea? –
AHHHHH! Lo tengo, mi propia ortografía estúpida, estabas en lo cierto, en el INotifyProperyChanged tuve "hasBeenAsnwered" en lugar de "hasBeenAnswered". private Boolean _hasBeenAnswered; public Boolean hasBeenAnswered { get {return _hasBeenAnswered; } conjunto { _hasBeenAnswered = value; NotifyPropertyChanged ("hasBeenAnswered"); } } } gracias por toda su ayuda. –
De nada. Pero me equivoqué originalmente, es decir, el DataContext en ItemContainerStyle es realmente el elemento dentro, no el ListBoxItem. Cambié mi ejemplo para que se parezca más a tu pregunta original, y también funciona. – Timores