I have a WPF data trigger that is set to fire when the value is true.
I want this trigger to fire every time this value is set to true, even if it was true before. Unfortunately, it seems that only fire if the value has changed from true to false or vice versa. My underlying data model fires the PropertyChanged event from INotifyPropertyChanged, even if the value is true twice in a row, but Trigger doesn't seem to pick it up.
In any case, to trigger the trigger regardless of whether the bound value has changed?
Some of you asked for the code, thatβs all. It is interesting to note that converters will be called each time. The problem is more specific to running the animation.
Update If I change my code to reset the value to false, and then again to true, it will start the animation. Obviously, this is not perfect and does not make the code enjoyable to read. I hope there is a better way to do this.
Any help is greatly appreciated.
WPF Code
<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>
Code for: -
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)); } }