Mam wyzwalacz danych WPF, który jest uruchamiany, gdy wartość jest prawdą.Wyzwalacz danych WPF nie uruchamia się, jeśli wartość pozostaje taka sama
Chcę, aby wyzwalacz uruchamiał się za każdym razem, gdy ta wartość jest ustawiona na wartość true, nawet jeśli była wcześniej prawdą. Niestety wydaje się, że wystrzeliwuje tylko wtedy, gdy wartość zmieni się z true na false lub vice versa. Mój bazowy model danych uruchamia zdarzenie PropertyChanged z INotifyPropertyChanged, nawet jeśli wartość jest ustawiona na true dwa razy z rzędu, ale Trigger nie wydaje się tego odbierać.
Czy mimo to należy uruchomić wyzwalacz, niezależnie od tego, czy zmieniona wartość została zmieniona?
Niektórzy z was prosili o kod, więc oto jest. Interesujące jest to, że konwertery będą wywoływane za każdym razem. Problem jest bardziej szczegółowy w przypadku uruchamiania animacji.
Aktualizacja Jeśli zmienię mojego kodu, aby zresetować wartość false, a następnie z powrotem na true znowu nie uruchamia animację. Oczywiście nie jest to idealne i nie czyni kodu przyjemnym do czytania. Mam nadzieję, że jest lepszy sposób na zrobienie tego.
Każda pomoc bardzo ceniona.
kod 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>
Code Behind: -
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));
}
}
Pokaż nam kod nieruchomości i spust, abyśmy nie musieli zgadywać. –
Proszę zobaczyć mój przykładowy kod powyżej. Animacja zostanie uruchomiona tylko raz. – user630190