19

バックグラウンド ワーカー スレッドの完了したメソッドで、オブジェクトの DataContext を設定しています。何らかの理由で、次のようなエラーが表示されます。

Chart1.DataContext=allDates 行を指しているツリー ウォークが進行中であるため、現時点ではこのノードの論理的な子を変更できません。

a tree walk is in progress とはどういう意味ですか? Dispatcher 操作も使用してこのセットを実行しようとしましたが、同じエラーが発生します...何かアイデアはありますか? Google は、このエラー メッセージについて何も表示しません。

これを引き起こしているコードは、Microsoft の Charting ツールキットの内部にあります... Microsoft の制御にバグが見つかったのだろうか...

ディスパッチャなし:

 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: 
4

9 に答える 9

10

解決しました!

問題: データが変更されるたびに、GUI でグラフを更新したい。

 myChart.DataContext = MTFdata;

これを行うと、次のエラーが表示されます: ツリー ウォークが進行中のため、現時点ではこのノードの論理的な子を変更できません

どうやって解決したか:

これのインスト:

 <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}"

お役に立てれば!

于 2014-08-17T12:23:41.297 に答える
8

もっと遊んだ後、これは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回目の呼び出しで失敗します。

于 2009-06-14T06:15:48.847 に答える
2

ねえ、

エラーが発生したばかりで、それも修正しました。データコンテキストの設定時にもエラーが発生しました。

データコンテキストが設定されているリストに selectionchanged-subscription があることがわかりました。この selectionchanged では、通知をサポートする別のプロパティを変更していました。これには、ビジュアル要素のバインディングがありました。

プロパティの設定にディスパッチャを使用することで問題を解決しました。

だから、変更のサブスクリプションを探してみてください...

于 2009-08-25T13:01:59.820 に答える
0

これが私の研究です。

WaybackMachine 上の上記リンクのミラー

これは、ツリー ウォークの進行中に FrameworkElement および FrameworkContentElement の Add/RemoveLogicalChild メソッドによってスローされる WPF 例外です。退屈な詳細はブログ投稿に記載されていますが、肝心なのは、テストして発生した場所をキャッチすること以上のことはできないということです。例外は、比較的まれにしか発生しないはずです。

于 2011-03-16T09:47:50.167 に答える
0

どうやら、使用中にコレクションを変更する操作が行われているようです。それは大したことではありません。

コードをさらに分析しなくても、私が言えるのはそれだけです。

于 2009-06-14T05:36:16.353 に答える
0

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++;
    } 
于 2011-09-19T10:16:18.900 に答える
-1

私も同じ問題を抱えてる。ただし、バックグラウンド スレッドは使用していません。スライダーがあり、スライダーの ValueChanged イベントで、DataContext を再計算してリセットしています。

たとえば、バーンダウンチャート。初期値が変更されると、グラフは自動的に更新されます (基本的に、折れ線シリーズの Y 軸)。

データ コンテキストの変更は、Silverlight 3 のベータ バージョンでは機能しました。リリース バージョンでは機能しません。(Chart1.Series[0] as DataPointSeries).ItemsSource の設定に関する上記のコメントは私にとってはうまくいきます

于 2009-07-16T06:22:11.517 に答える