I apply a WPF theme in my application. At some point in my code, I need to change the selected tree view item. so I update the property MyViewModel.IsSelected and raise PropertyChanged event.
Then I get this:
Object reference not set to an instance of an object.
System.Windows.StyleHelper.EvaluateOldNewStates(MultiTrigger multiTrigger, DependencyObject triggerContainer, DependencyProperty changedProperty, DependencyPropertyChangedEventArgs changedArgs, Int32 sourceChildIndex, Style style, FrameworkTemplate frameworkTemplate, Boolean& oldState, Boolean& newState) System.Windows.StyleHelper.InvokePropertyTriggerActions(TriggerBase triggerBase, DependencyObject triggerContainer, DependencyProperty changedProperty, DependencyPropertyChangedEventArgs changedArgs, Int32 sourceChildIndex, Style style, FrameworkTemplate frameworkTemplate) System.Windows.StyleHelper.OnTriggerSourcePropertyInvalidated(Style ownerStyle, FrameworkTemplate frameworkTemplate, DependencyObject container, DependencyProperty dp, DependencyPropertyChangedEventArgs changedArgs, Boolean invalidateOnlyContainer, FrugalStructList`1& triggerSourceRecordFromChildIndex, FrugalMap& propertyTriggersWithActions, Int32 sourceChildIndex) System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, OperationType operationType) System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp) System.Windows.Data.BindingExpression.Invalidate(Boolean isASubPropertyChange) System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange) MS.Internal.Data.ClrBindingWorker.NewValueAvailable(Boolean dependencySourcesChanged, Boolean initialValue, Boolean isASubPropertyChange) MS.Internal.Data.PropertyPathWorker.UpdateSourceValueState(Int32 k, ICollectionView collectionView, Object newValue, Boolean isASubPropertyChange) MS.Internal.Data.ClrBindingWorker.OnSourcePropertyChanged(Object o, String propName) MS.Internal.Data.PropertyPathWorker.System.Windows.IWeakEventListener.ReceiveWeakEvent(Type managerType, Object sender, EventArgs e) System.Windows.WeakEventManager.DeliverEventToList(Object sender, EventArgs args, ListenerList list) System.ComponentModel.PropertyChangedEventManager.OnPropertyChanged(Object sender, PropertyChangedEventArgs args) D:\MyAssembly\PropertyChangedEventHandlerExtension.cs(26, 1): At MyAssembly.ComponentModel.PropertyChangedEventHandlerExtension.Invoke[T](PropertyChangedEventHandler iHandler, Expression`1 iPropertySelector) [...]
I investigated my theme for multi triggers that could cause the exception. I find this:
<MultiTrigger><MultiTrigger.Conditions><ConditionProperty="IsMouseOver"SourceName="Selection_Border"Value="True"/><ConditionProperty="IsSelected"Value="False"/></MultiTrigger.Conditions><!-- Using this, there is no exception --><SetterProperty="Opacity"TargetName="HoverBorder"Value="1"/><!-- But using actions with storyboards generates the exception --><MultiTrigger.EnterActions><BeginStoryboardStoryboard="{StaticResource HoverOn}"/></MultiTrigger.EnterActions><MultiTrigger.ExitActions><BeginStoryboardStoryboard="{StaticResource HoverOff}"/></MultiTrigger.ExitActions></MultiTrigger>
[...]
<Storyboardx:Key="HoverOn"><DoubleAnimationUsingKeyFramesBeginTime="00:00:00"Storyboard.TargetName="HoverBorder"Storyboard.TargetProperty="(UIElement.Opacity)"><SplineDoubleKeyFrameKeyTime="00:00:00.1000000"Value="1"/></DoubleAnimationUsingKeyFrames></Storyboard><Storyboardx:Key="HoverOff"><DoubleAnimationUsingKeyFramesBeginTime="00:00:00"Storyboard.TargetName="HoverBorder"Storyboard.TargetProperty="(UIElement.Opacity)"><SplineDoubleKeyFrameKeyTime="00:00:00.3000000"Value="0"/></DoubleAnimationUsingKeyFrames></Storyboard>
So basically, if I set my HoverBorder opacity directly using a setter, it works. If I change the opacity using storyboards instead, it crashes.
Everything works fine if I change selection using the mouse. The exception happens only in this particular case where selection is updated from the code for a particular scenario. (In some other scenarios, I do chnage selection and it works. It just does
not work for that particular scenario).
Any idea why it throws this exception and if there is a way to avoid it?
-Sylvain