Wpf 此时无法修改此节点的逻辑子节点,因为正在进行树漫游
我有两个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();
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将清除,另一个图表将更改值