Wpf 此时无法修改此节点的逻辑子节点,因为正在进行树漫游

Wpf 此时无法修改此节点的逻辑子节点,因为正在进行树漫游,wpf,charts,wpftoolkit,Wpf,Charts,Wpftoolkit,我有两个wpf工具包图表,一个是饼图,第二个是条形图 我有一个只在表单加载时调用的方法 chartGuest.DataContext = null; List<KeyValuePair<string, int>> valueList = new List<KeyValuePair<string, int>>(); HProDataContext db = new HProDataContext();

我有两个wpf工具包图表,一个是饼图,第二个是条形图

我有一个只在表单加载时调用的方法

 chartGuest.DataContext = null;
            List<KeyValuePair<string, int>> valueList = new List<KeyValuePair<string, int>>();
            HProDataContext db = new HProDataContext();

            var _RoomTypes = (from d in db.roomtypes select d.roomtype1).ToList();
            var _RoomTypeID = (from d in db.roomtypes select d.id).ToList();
            int count = 0;

            for (int i = 0; i < _RoomTypeID.Count; i++)
            {
                count = Convert.ToInt32((from d in db.actions where d.room.roomtypeid == _RoomTypeID[i] select d.id).Count());
                valueList.Add(new KeyValuePair<string, int>(_RoomTypes[i], count));

            }
            chartGuest.DataContext = valueList;
chartGuest.DataContext=null;
列表值列表=新列表();
HProDataContext db=新的HProDataContext();
var_RoomTypes=(从db.RoomTypes中的d选择d.roomtype1.ToList();
var_RoomTypeID=(从db.roomtypes中的d选择d.id);
整数计数=0;
对于(int i=0;i<\u RoomTypeID.Count;i++)
{
count=Convert.ToInt32((从db.actions中的d开始,其中d.room.roomtypeid==\u roomtypeid[i]选择d.id)。count());
添加(新的KeyValuePair(_RoomTypes[i],count));
}
chartGuest.DataContext=valueList;
它导致这样的错误:此时无法修改此节点的逻辑子节点,因为正在进行树遍历

同样的代码在饼图系列图表上非常有效

这是我的图表:

 <charting:Chart x:Name="chartRoomType" Width="402" Height="255" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="15,275,0,0">
            <charting:Chart.Series>
                <charting:PieSeries ItemsSource="{Binding}" DependentValuePath="Value" IndependentValuePath="Key" Title="Room Types" IsSelectionEnabled="True" />
            </charting:Chart.Series>
                    </charting:Chart>
                    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="314,292,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click"  />
                    <TextBlock Height="23" HorizontalAlignment="Left" Margin="28,296,0,0" Name="textBlock4" Text="Room Types" VerticalAlignment="Top" />
                        <charting:Chart x:Name="chartGuest" Height="269" VerticalAlignment="Top" Margin="6,0" Title="Guests">
                            <charting:Chart.Series>
                                <charting:BarSeries ItemsSource="{Binding}" DependentValuePath="Value" IndependentValuePath="Key" Title="Room Types" IsSelectionEnabled="True" />
                            </charting:Chart.Series>
                        </charting:Chart>

有人能帮我吗? 另外,我发现了这个问题,但毫无帮助

使用DataPointSeries.ItemsSource绑定到数据上下文。

假设这是窗口面板的XAML,其中datagrid和charting控件共享一个公共列表作为
ItemsSource

  <StackPanel>
    <tk:DataGrid MaxHeight="200" AutoGenerateColumns="False"
                 ItemsSource="{Binding}"
                 IsReadOnly="True">
        <tk:DataGrid.Columns>
            <tk:DataGridTextColumn Header="Key"
                                   Binding="{Binding Key, Mode=OneWay}"/>
            <tk:DataGridTextColumn Header="Value"
                                   Binding="{Binding Value, Mode=OneWay}"/>
        </tk:DataGrid.Columns>
    </tk:DataGrid>

    <charting:Chart MaxHeight="300"
                    Title="Title"
                    LegendTitle="Legend"
                    Name="Chart1">
        <charting:AreaSeries DependentValuePath="Value"
                             IndependentValuePath="Key"
                             Background="Red" >
            <charting:DataPointSeries.ItemsSource>
                <Binding BindsDirectlyToSource="True"/>
            </charting:DataPointSeries.ItemsSource>
        </charting:AreaSeries>
    </charting:Chart>

    <Button Content="Change DataGrid and Chart Data" Click="Button_Click"/>
</StackPanel>

在代码隐藏中,我们重置窗口的数据上下文

    private List<KeyValuePair<int, int>> list1;

    public Window1()
    {
        InitializeComponent();

        list1 = new List<KeyValuePair<int, int>>();
        var random = new Random();
        for(int i = 0; i < 1000; i++)
        {
            list1.Add(new KeyValuePair<int, int>(i, random.Next()));
        }

        this.DataContext = list1;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        list1 = new List<KeyValuePair<int, int>>();
        var random = new Random();
        for (int i = 0; i < 1000; i++)
        {
            list1.Add(new KeyValuePair<int, int>(i, random.Next()));
        }

        this.DataContext = list1;
    }
私有列表列表1;
公共窗口1()
{
初始化组件();
list1=新列表();
var random=新的random();
对于(int i=0;i<1000;i++)
{
添加(新的KeyValuePair(i,random.Next());
}
this.DataContext=list1;
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
list1=新列表();
var random=新的random();
对于(int i=0;i<1000;i++)
{
添加(新的KeyValuePair(i,random.Next());
}
this.DataContext=list1;
}
每次单击按钮,图表都会刷新,不会出错


让我知道这是否有帮助。

我在不同的情况下收到了相同的异常。我使用的代码接受现有UIElement的集合,创建新的UIElement,并将第一个UIElement设置为第二个UIElement的内容。另外,它从现有UIElement中获取属性值,并将其设置为新UIElement的不同属性的值

foreach(UIElement insideElement in uiElementCollection)
{
    var outsideElement = new TabItem
    {
         Content = insideElement
         ,Header = insideElement.Title
    }
}
foreach(UIElement insideElement in uiElementCollection)
{
    var outsideElement = new TabItem
    {
         Content = insideElement
    }

    BindingExpression titleBindingExpression = pageControl.GetBindingExpression(MyUIElement.TitleProperty);
        if (titleBindingExpression != null)
            {                            
                tabItem.SetBinding(HeaderedContentControl.HeaderProperty, new Binding { Source = titleBindingExpression.DataItem, Path = titleBindingExpression.ParentBinding.Path });

            }
            else
            {
                tabItem.Header = innerUIElement.Title;
            }
}
但在这种情况下,inside属性的标题可以是绑定,但上面的代码仅复制值,并且当insideElement.Title绑定到某个源outsideElement.Header时,不会反映更改。 所以我修改了代码,将HeaderProperty绑定到insideElement的TitleProperty:

foreach(UIElement insideElement in uiElementCollection)
{
    var outsideElement = new TabItem
    {
         Content = insideElement
    }

    outsideElement.SetBinding(HeaderedContentControl.HeaderProperty,
                        new Binding
                        {
                            Source = insideElement,
                            Path = new PropertyPath(MyUIElement.TitleProperty)
                        });
}
但当我执行上面的代码时,我收到了

System.InvalidOperationException:此时无法修改此节点的逻辑子级,因为正在进行树遍历

我发现我无法将一个依赖项属性绑定到另一个依赖项属性,它存储在Content属性中

我尝试获取innerUIElement的绑定表达式,并将其设置为outsideUIElement的HeaderProperty的新绑定

foreach(UIElement insideElement in uiElementCollection)
{
    var outsideElement = new TabItem
    {
         Content = insideElement
         ,Header = insideElement.Title
    }
}
foreach(UIElement insideElement in uiElementCollection)
{
    var outsideElement = new TabItem
    {
         Content = insideElement
    }

    BindingExpression titleBindingExpression = pageControl.GetBindingExpression(MyUIElement.TitleProperty);
        if (titleBindingExpression != null)
            {                            
                tabItem.SetBinding(HeaderedContentControl.HeaderProperty, new Binding { Source = titleBindingExpression.DataItem, Path = titleBindingExpression.ParentBinding.Path });

            }
            else
            {
                tabItem.Header = innerUIElement.Title;
            }
}

现在,外部UI元素绑定到同一个源,WPF presenter不会引发异常。我的问题解决了。

我知道这已经有一段时间了,但万一有人碰到它,我会找到另一种解决方法。将图表放入StackPanel,创建时可见性为“折叠”(“隐藏”不起作用)。然后在第一次设置DataContext之后将可见性设置为“Visible”(我每次都这样做,但在第一次之后它是多余的)


我的经验与我所看到的报告一致,问题是在拥有空数据上下文后设置非空数据上下文时出现的错误;但很明显,如果图表崩溃,它不会进行“树上行走”

使用链接问题的可接受答案评论中描述的解决方法。此错误报告中也对其进行了描述:。可能重复此错误报告如何帮助我?当我调用这个方法时,它的go this.DataContext=dataEmpty;在这里,我的图表将不会填充值,如果我再次调用它,将给出相同的错误。这对我有什么帮助?好吧,我的坏
dataEmpty
应该是
data
。。。请参阅上面我编辑的答案。。。如果你完全按照上面显示的方式来做,那么它就不会给出你得到的错误。因为当我设置了
DataContext
时,它给了我同样的错误,但是当我重新使用相同的数据cotext和
Clear
Add
时,它工作了!不,它不工作太多,因为我有datagrid相同的窗口,当使用这个时。DataContext=data;我的网格正在清理。除此之外,我还有很多图表window@Acid我就是这么说的。DataGrid或任何其他网格控件工作,并且不会抛出此错误。但图表控制确实如此。在我的例子中,它也给出了这个错误。但当我保持绑定可观察集合的引用不变,并通过清除和添加新项来重用它时,它就起作用了。可能如果你发布更多的代码,它可以帮助我了解你到底是什么错误。我有一个窗口,其中是datagrid和3个图表,两个条形图和一个饼图,我想从datagrid的数据上下文中的可观察集合中取值,然后将其绑定到图表中。如果我使用您的代码,datagrid将清除,另一个图表将更改值