Вот пример, который полностью воспроизводит вашу проблему:
<StackPanel>
<StackPanel.Resources>
<l:MyBool x:Key="MyBool" IsTrue="False" />
</StackPanel.Resources>
<CheckBox x:Name="myCheckBox"
Content="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}"
IsChecked="{Binding Source={StaticResource MyBool}, Path=IsTrue, Mode=TwoWay}"
HorizontalAlignment="Center"
VerticalAlignment="Top">
<CheckBox.Triggers>
<EventTrigger RoutedEvent="UIElement.MouseEnter">
<BeginStoryboard x:Name="isCheckedBeginStoryboard">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsChecked">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<System:Boolean>True</System:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="UIElement.MouseLeave">
<StopStoryboard BeginStoryboardName="isCheckedBeginStoryboard" />
</EventTrigger>
</CheckBox.Triggers>
</CheckBox>
<CheckBox Content="Also two way binding to MyBool.IsTrue no animation" IsChecked="{Binding Source={StaticResource MyBool}, Path=IsTrue}" />
<TextBlock Text="{Binding Source={StaticResource MyBool}, Path=IsTrue, StringFormat={}MyBool.IsTrue: {0}}" />
<TextBlock Text="{Binding ElementName=myCheckBox, Path=IsChecked, StringFormat={}myCheckBox.IsChecked: {0}}" />
</StackPanel>
Где MyBool
- это простой класс, который также реализует INotifyPropertyChanged
:
public class MyBool : INotifyPropertyChanged
{
private bool _isTrue;
public bool IsTrue
{
get { return _isTrue; }
set
{
if (_isTrue != value)
{
_isTrue = value;
NotifyPropertyChanged("IsTrue");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Как вы можете видетьот запуска этого, когда анимация активна, ваш StaticResource
не обновляется - когда анимация НЕ активна, она активна.Это происходит потому, что при запуске анимации WPF предоставляет новое значение для свойства IsChecked
(как определено вашим Storyboard
).Это эффективно сглаживает старое значение - двустороннее Binding
до StaticResource
.После завершения анимации и ее остановки WPF восстановит старое значение IsChecked
до исходного выражения привязки, поэтому ваш ресурс MyBool
продолжит получать обновления.
Отличная статья по DependencyProperty
значение приоритета можно найти здесь:
http://msdn.microsoft.com/en-us/library/ms743230.aspx
Надеюсь, это поможет!