Tengo un disparador de datos WPF que se activa cuando un valor es verdadero.WPF DataTrigger no se activa si el valor sigue siendo el mismo
Quiero disparar este disparador cada vez que este valor se establece en verdadero, incluso si era cierto antes. Desafortunadamente, parece disparar solo si el valor cambia de verdadero a falso o viceversa. Mi modelo de datos subyacente está activando el evento PropertyChanged de INotifyPropertyChanged incluso si el valor se establece en verdadero dos veces seguidas, pero el desencadenador no parece recoger esto.
¿Hay alguna forma de hacer que el disparador se ejecute independientemente de si el valor encuadernado ha cambiado?
Algunos de ustedes han pedido el código, así que aquí está. Es interesante notar que los conversores serán llamados cada vez. El problema es más específico para ejecutar una animación.
Actualización Si cambio mi código para restablecer el valor a falso y luego de nuevo a verdadero, desencadena la animación. Obviamente, esto no es ideal y no hace que el código sea agradable de leer. Espero que haya una mejor manera de hacer esto.
Cualquier ayuda muy apreciada.
código WPF
<Grid>
<Grid.Resources>
<Storyboard x:Key="AnimateCellBlue">
<ColorAnimation Storyboard.TargetProperty="Background.Color" From="Transparent" To="Blue" Duration="0:0:0.1" AutoReverse="True" RepeatBehavior="1x" />
</Storyboard>
</Grid.Resources>
<TextBox Name="txtBox" Text="{Binding DataContext.DisplayText, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}">
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding DataContext.IsTrue, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard Name="BidSizeUpStoryB" Storyboard="{StaticResource AnimateCellBlue}" />
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</Grid>
código subyacente: -
public partial class MainWindow : Window
{
private DataItem _dataItem;
private DispatcherTimer _dispatcherTimer;
public MainWindow()
{
InitializeComponent();
_dataItem = new DataItem();
_dataItem.DisplayText = "Testing";
_dataItem.IsTrue = true;
this.DataContext = _dataItem;
_dispatcherTimer = new DispatcherTimer(TimeSpan.FromSeconds(1), DispatcherPriority.Normal, TimerCallbackHandler, Dispatcher);
}
private void TimerCallbackHandler(object s, EventArgs args)
{
Console.WriteLine("In Timer");
_dataItem.IsTrue = true;
_dataItem.DisplayText = "Timer " + DateTime.Now.Ticks;
}
}
DataItem: -
public class DataItem : INotifyPropertyChanged
{
private bool _isTrue;
private string _displayText;
public bool IsTrue
{
get { return _isTrue; }
set
{
_isTrue = value;
NotifyPropertyChanged("IsTrue");
}
}
public string DisplayText
{
get
{
return _displayText;
}
set
{
_displayText = value;
NotifyPropertyChanged("DisplayText");
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
Muéstranos el código de la propiedad y el activador para que no tengamos que adivinar. –
Por favor vea mi código de muestra arriba. La animación se disparará solo una vez. – user630190