Quantcast
Channel: Windows Presentation Foundation (WPF) forum
Viewing all articles
Browse latest Browse all 18858

EvaluateOldNewStates() throws exception when updating TreeViewItem.IsSelected

$
0
0
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

Viewing all articles
Browse latest Browse all 18858

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>