Что не может изменить логические дети для этого node в это время, потому что идет древовидная дорожка?
Я устанавливаю DataContext объекта в завершенном методе фонового рабочего потока. По какой-то причине я получаю сообщение об ошибке:
Невозможно изменить логические дочерние элементы для этого node в это время, потому что идет древовидная дорожка, указывающая на строку Chart1.DataContext = allDates.
Что означает прогулка по дереву? Я пробовал сделать этот набор, используя операцию Dispatcher, и это дает ту же ошибку... Любые идеи? Google ничего не сообщает об этом сообщении об ошибке.
Код, вызывающий это, является внутренним для инструментария Microsoft Charting... Интересно, нашел ли я ошибку в своем управлении...
Без диспетчера:
void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
ArticlesPerTimePeriodResult result = (ArticlesPerTimePeriodResult)e.Result;
lvArticles.ItemsSource = result.DatesOfArticles;
Chart1.DataContext = result.AllDates;
}
С Диспетчером:
void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
ArticlesPerTimePeriodResult result = (ArticlesPerTimePeriodResult)e.Result;
lvArticles.ItemsSource = result.DatesOfArticles;
Dispatcher.BeginInvoke((Action<List<KeyValuePair<DateTime,int>>>)(delegate(List<KeyValuePair<DateTime,int>> allDates)
{
Chart1.DataContext = allDates;
}), result.AllDates);
//Chart1.DataContext = result.AllDates;
}
Ошибка:
System.Reflection.TargetInvocationException was unhandled
Message="Exception has been thrown by the target of an invocation."
Source="mscorlib"
StackTrace:
at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
at System.Windows.Threading.DispatcherOperation.InvokeImpl()
at System.Threading.ExecutionContext.runTryCode(Object userData)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Windows.Threading.DispatcherOperation.Invoke()
at System.Windows.Threading.Dispatcher.ProcessQueue()
at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.TranslateAndDispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Application.RunInternal(Window window)
at NewsCluesWpf.App.Main() in C:\SoftwareInstall\VSProjects\NewsClues\NewsCluesWpf\obj\Debug\App.g.cs:line 0
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException: System.InvalidOperationException
Message="Cannot modify the logical children for this node at this time because a tree walk is in progress."
Source="PresentationFramework"
StackTrace:
at System.Windows.FrameworkElement.AddLogicalChild(Object child)
at System.Windows.Controls.UIElementCollection.InsertInternal(Int32 index, UIElement element)
at System.Windows.Controls.DataVisualization.ObservableCollectionListAdapter`1.<>c__DisplayClass1.<OnCollectionChanged>b__0(T item, Int32 index)
at System.Windows.Controls.DataVisualization.EnumerableFunctions.ForEachWithIndex[T](IEnumerable`1 that, Action`2 action)
at System.Windows.Controls.DataVisualization.ObservableCollectionListAdapter`1.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedAction action, Object item, Int32 index)
at System.Collections.ObjectModel.ObservableCollection`1.InsertItem(Int32 index, T item)
at System.Windows.Controls.DataVisualization.ReadOnlyObservableCollection`1.InsertItem(Int32 index, T item)
at System.Collections.ObjectModel.Collection`1.Insert(Int32 index, T item)
at System.Windows.Controls.DataVisualization.AggregatedObservableCollection`1.<>c__DisplayClass14.<>c__DisplayClass16.<ChildCollectionCollectionChanged>b__f(ReadOnlyObservableCollection`1 that)
at System.Windows.Controls.DataVisualization.ReadOnlyObservableCollection`1.Mutate(Action`1 action)
at System.Windows.Controls.DataVisualization.AggregatedObservableCollection`1.<>c__DisplayClass14.<ChildCollectionCollectionChanged>b__e(T item, Int32 index)
at System.Windows.Controls.DataVisualization.EnumerableFunctions.ForEachWithIndex[T](IEnumerable`1 that, Action`2 action)
at System.Windows.Controls.DataVisualization.AggregatedObservableCollection`1.ChildCollectionCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedAction action, Object item, Int32 index)
at System.Collections.ObjectModel.ObservableCollection`1.InsertItem(Int32 index, T item)
at System.Collections.ObjectModel.Collection`1.Add(T item)
at System.Windows.Controls.DataVisualization.Charting.Chart.AddAxisToChartArea(Axis axis)
at System.Windows.Controls.DataVisualization.Charting.Chart.ActualAxesCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedAction action, Object item, Int32 index)
at System.Collections.ObjectModel.ObservableCollection`1.InsertItem(Int32 index, T item)
at System.Windows.Controls.DataVisualization.UniqueObservableCollection`1.InsertItem(Int32 index, T item)
at System.Collections.ObjectModel.Collection`1.Add(T item)
at System.Windows.Controls.DataVisualization.Charting.DataPointSeriesWithAxes.GetAxes(DataPoint firstDataPoint, Func`2 independentAxisPredicate, Func`1 independentAxisFactory, Func`2 dependentAxisPredicate, Func`1 dependentAxisFactory)
at System.Windows.Controls.DataVisualization.Charting.AreaSeries.GetAxes(DataPoint firstDataPoint)
at System.Windows.Controls.DataVisualization.Charting.DataPointSeriesWithAxes.GetAxes()
at System.Windows.Controls.DataVisualization.Charting.DataPointSeriesWithAxes.OnDataPointsChanged(IList`1 newDataPoints, IList`1 oldDataPoints)
at System.Windows.Controls.DataVisualization.Charting.DataPointSingleSeriesWithAxes.OnDataPointsChanged(IList`1 newDataPoints, IList`1 oldDataPoints)
at System.Windows.Controls.DataVisualization.Charting.LineAreaBaseSeries`1.OnDataPointsChanged(IList`1 newDataPoints, IList`1 oldDataPoints)
at System.Windows.Controls.DataVisualization.Charting.DataPointSeries.LoadDataPoints(IEnumerable newItems, IEnumerable oldItems)
at System.Windows.Controls.DataVisualization.Charting.DataPointSeries.Refresh()
at System.Windows.Controls.DataVisualization.Charting.DataPointSeries.OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue)
at System.Windows.Controls.DataVisualization.Charting.DataPointSeries.OnItemsSourceChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, OperationType operationType)
at System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp)
at System.Windows.Data.BindingExpression.Invalidate(Boolean isASubPropertyChange)
at System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange)
at System.Windows.Data.BindingExpression.Activate(Object item)
at System.Windows.Data.BindingExpression.HandlePropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
at System.Windows.Data.BindingExpression.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
at System.Windows.DependentList.InvalidateDependents(DependencyObject source, DependencyPropertyChangedEventArgs sourceArgs)
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, OperationType operationType)
at System.Windows.TreeWalkHelper.OnInheritablePropertyChanged(DependencyObject d, InheritablePropertyChangeInfo info)
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d)
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren)
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren)
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d)
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d)
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren)
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren)
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d)
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d)
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren)
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren)
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d)
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d)
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren)
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren)
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d)
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d)
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren)
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d)
at System.Windows.DescendentsWalker`1.StartWalk(DependencyObject startNode, Boolean skipStartNode)
at System.Windows.TreeWalkHelper.InvalidateOnInheritablePropertyChange(FrameworkElement fe, FrameworkContentElement fce, InheritablePropertyChangeInfo info, Boolean skipStartNode)
at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, OperationType operationType)
at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, OperationType operationType, Boolean isInternal)
at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
at System.Windows.FrameworkElement.set_DataContext(Object value)
at NewsCluesWpf.ArticlesPerDay.<bg_RunWorkerCompleted>b__1(List`1 allDates) in C:\SoftwareInstall\VSProjects\NewsClues\NewsCluesWpf\ArticlesPerDay.xaml.cs:line 72
InnerException:
Ответы
Ответ 1
После игры больше, я думаю, что это ошибка в наборе инструментов Silverlight.
Следующий код вызывает аварийный сбой.
int runCount = 0;
private void bindChart(string searchString)
{
List<KeyValuePair<DateTime, int>> dataEmpty = new List<KeyValuePair<DateTime, int>>();
List<KeyValuePair<DateTime, int>> dataFilled = new List<KeyValuePair<DateTime, int>>();
dataFilled.Add(new KeyValuePair<DateTime, int>(DateTime.Today, 1));
if (runCount == 0)
{
Chart1.DataContext= dataEmpty;
}
else
{
Chart1.DataContext = dataFilled;
}
runCount++;
}
XAML:
<charting:Chart Grid.Row="0"
Title="Title"
LegendTitle="Legend" Name="Chart1" Grid.RowSpan="2">
<charting:AreaSeries ItemsSource="{Binding}"
DependentValuePath="Value"
IndependentValuePath="Key"
Background="Red" />
</charting:Chart>
Это произойдет при втором вызове bindChart.
Ответ 2
РЕШИТЬ!
Проблема: я хочу обновлять график в графическом интерфейсе каждый раз, когда некоторые данные изменяются.
myChart.DataContext = MTFdata;
когда я делаю это, я получаю ошибку: не удается изменить логические дочерние элементы для этого node в это время, потому что идет древовидная обработка
Как я его решил:
Указано:
<chartingToolkit:LineSeries DependentValuePath="Key"
IndependentValuePath="Value"
ItemsSource="{Binding}"
IsSelectionEnabled="False"
>
Используйте это:
<chartingToolkit:LineSeries DependentValuePath="Key"
IndependentValuePath="Value"
ItemsSource="{Binding}"
DataContext="{Binding}"
IsSelectionEnabled="False"
>
Используйте как ItemsSource="{Binding}"
, так и DataContext="{Binding}"
Надеюсь, это поможет!
Ответ 3
Hej,
У меня только что была ошибка и исправлена.
Ошибка также корректируется при настройке datacontext.
Я обнаружил, что в списке, имеющем набор данных datacontext, была выделена выделенная подписка. В этом selectionchanged я изменял другое свойство с поддержкой уведомлений, в которой на нем был привязан визуальный элемент.
Решена проблема с помощью диспетчера для установки свойства.
Итак, попробуйте найти подписки на изменения...
Ответ 4
По-видимому, выполняется некоторая операция, которая меняет коллекцию во время ее использования. Это большой нет-нет.
Не анализируя код дальше, все, что я могу сказать.
Ответ 5
Вот мое исследование об этом.
Зеркало указанной ссылки на WaybackMachine.
Это исключение WPF, создаваемое методами Add/RemoveLogicalChild в FrameworkElement и FrameworkContentElement, когда выполняется обход дерева. Скучные детали этого есть в сообщении в блоге, но суть в том, что вы не можете сделать больше, чем просто проверить его, а затем поймать его там, где это происходит. Исключением должен быть относительно редкий случай.
Ответ 6
Вместо сброса DataContext
повторное использование через наблюдаемую коллекцию также работает...
int runCount = 0;
private void bindChart()
{
ObservableCollection<KeyValuePair<DateTime, int>> data = new ObservableCollection<KeyValuePair<DateTime, int>>();
if (runCount == 0)
{
this.DataContext = dataEmpty;
}
else
{
var de = this.DataContext as ObservableCollection<KeyValuePair<DateTime, int>>;
de.Clear();
for (var i = 0; i < (new Random(DateTime.Now.Second)).Next(100); i++)
{
de.Add(new KeyValuePair<DateTime, int>(DateTime.Today.AddDays(i), i));
}
}
runCount++;
}
Ответ 7
У меня была эта проблема с инструментарием WPF. Все говорили не связываться с DataContext и напрямую связываться с ItemsSource, но я уже привязывался к ItemsSource и все еще получал ошибку. В моем случае я привязывался к SelectedItem
ListBox или TreeView. Единственное, что я мог получить, это вручную привязать к ItemsSource
, когда срабатывает событие SelectedItemChanged().
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (TreeView.SelectedItem != null)
LineSeries.ItemsSource = (TreeView.SelectedItem as MyObject).Items;
}
Ответ 8
У меня возникла эта проблема, когда родительский элемент управления (AvalonDock) вызвал перезагрузку дочернего пользовательского элемента управления: пользовательский элемент управления запустил событие "Загружено", и мое приложение сработало бы.
Я удалил обработчик Loaded event из пользовательского элемента управления и вместо него использовал инициализированное событие. Это исправило мою проблему, хотя я не совсем уверен, почему.
Ответ 9
У меня та же проблема. Тем не менее, я не использую ни одного фонового потока. У меня только слайдер и событие ValueChanged для слайдера, я пересчитываю и перезапускает DataContext.
Например, диаграмма сгореть. По мере изменения начального значения график автоматически обновляется (по существу, по оси Y линейной серии).
Изменение datacontext работало в бета-версии silverlight 3. Не работает в версии выпуска. Вышеупомянутый комментарий о настройке (Chart1.Series [0] как DataPointSeries).ItemsSource работает для меня