wpf-dispara el datatrigger cuando la propiedad cambia sin importar el nuevo valor
datagrid (5)
¿Podrías hackear algo con un convertidor de valores?
<DataTrigger Binding="{Binding Path=FirstName, Converter=FirstNameConverter}" Value="MakeItSo">
y
class FirstNameConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return "MakeItSo";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
...
}
}
Supongo que depende de si WPF llama al convertidor en cada cambio de propiedad, o si evalúa el valor primero. No lo he probado, es solo un pensamiento ...
Estoy intentando ejecutar una animación en una celda en una cuadrícula de datos cuando cambia el valor de la celda de la cuadrícula de datos.
La propia cuadrícula de datos está vinculada a una colección observable de objetos CLR antiguos sin formato. En este caso, digamos que los objetos son objetos ''Person'' con propiedades para ''Nombre'', ''Apellido'' y ''Edad''. La clase ''Persona'' implementa la interfaz INotifyPropertyChanged y cada propiedad tiene la llamada apropiada a onPropertyChanged en su configurador.
Todo esto está bien. En la definición de datagrid, he configurado mi plantilla de datos para dibujar cada celda y también he adjuntado un procesador de datos ... de la siguiente manera:
<DataGridTemplateColumn Header="FirstName">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border Name="templateBorder">
<TextBlock Name="templateTextBlock" Text="{Binding Path=FirstName}" />
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=FirstName}" Value="Richard">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard AutoReverse="True">
<DoubleAnimation Storyboard.TargetName="templateTextBlock" Storyboard.TargetProperty="Opacity" To=".1" Duration="0:0:.5" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Cuando un objeto en mi ObservableCollection se actualiza (cambié el valor de FirstName) el datagrid se actualiza bien. Según el ejemplo anterior, si cambié el valor de Nombre a ''Richard'', la animación también se ejecutará bien.
Mi problema es que necesito ejecutar mi animación independientemente de cuál sea el nuevo valor de Nombre. He rastreado la web, pero algunos parecen encontrar ejemplos de cómo disparar el disparador contra un valor conocido, por ejemplo, disparar cuando el Nombre es "Richard", como he demostrado en mi ejemplo.
Mi pregunta es ¿cómo puedo disparar el datatrigger independientemente del valor de la propiedad actualizada? Básicamente, ¿cómo puedo disparar el datatrigger siempre que la propiedad FirstName se actualice para una fila dada en el datagrid?
Muchas gracias.
Gracias a los indicadores obtenidos con las respuestas a esta pregunta, encontré que la respuesta fue utilizar un Event Trigger y TargetUpdated RoutedEvent.
<DataTemplate>
<Border Name="templateBorder">
<TextBlock Name="templateTextBlock" Text="{Binding Path=FirstName, NotifyOnTargetUpdated=True}" />
</Border>
<DataTemplate.Triggers>
<EventTrigger RoutedEvent="Binding.TargetUpdated">
<BeginStoryboard>
<Storyboard AutoReverse="True">
<DoubleAnimation Storyboard.TargetName="templateTextBlock" Storyboard.TargetProperty="Opacity" To=".1" Duration="0:0:.5" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</DataTemplate.Triggers>
</DataTemplate>
Más allá de EventTrigger, la única otra cosa que se requería era establecer ''NotifyOnTargetUpdated = True'' al configurar el enlace para el bloque de texto.
Gracias.
Parece que necesita un EventTrigger "haga X cuando ocurra un evento" en lugar de un Data Trigger.
No intenté esto yo mismo ... pero debería ser posible elevar su evento personalizado FirstNameChanged y hacer que las acciones de activación se ejecuten en respuesta a eso.
Puede intentar establecer el DataContext del TextBlock en la propiedad FirstName y luego usar el evento DataContextChanged .
O puede usar el evento PropertyChanged y filtrar la propiedad que desea.
De cualquier manera creo que vas a tener que usar un evento.
<Storyboard x:Key="MessageStoryBoardEntry" FillBehavior="Stop">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<EasingDoubleKeyFrame KeyTime="0:0:00.30" Value="0"/>
<EasingDoubleKeyFrame KeyTime="0:0:03" Value="0"/>
<EasingDoubleKeyFrame KeyTime="0:0:03.20" Value="1500"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="MessageStoryBoardExit" FillBehavior="Stop">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<EasingDoubleKeyFrame KeyTime="0:0:0.001" Value="1500"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>