绑定更新将新闻系列添加到WPF工具包图表中(而不是替换/更新系列)

绑定更新将新闻系列添加到WPF工具包图表中(而不是替换/更新系列),wpf,binding,charts,wpftoolkit,Wpf,Binding,Charts,Wpftoolkit,我目前正在我的应用程序中重新编写条形图,以利用中的chart类。使用MVVM,我将图表中列系列的项源绑定到viewmodel上的属性。以下是相关的XAML: <charting:Chart> <charting:ColumnSeries ItemsSource="{Binding ScoreDistribution.ClassScores}" IndependentValuePath="ClassName" Dependen

我目前正在我的应用程序中重新编写条形图,以利用中的
chart
类。使用MVVM,我将图表中
列系列
项源
绑定到viewmodel上的属性。以下是相关的XAML:

<charting:Chart>
  <charting:ColumnSeries ItemsSource="{Binding ScoreDistribution.ClassScores}"
                         IndependentValuePath="ClassName" DependentValuePath="Score"/>
</charting:Chart>
但是,当我更新
ScoreDistribution
属性(通过将其设置为新的
ScoreDistribution
对象)时,图表将获得一个额外的系列(基于新的ScoreDistribution),同时保留原始系列(基于以前的ScoreDistribution)

为了说明这一点,这里有两个屏幕截图,显示了更新前(在
ScoreDistribution.ClassScores
中有一个数据点)和更新后(现在在
ScoreDistribution.ClassScores
中有三个数据点)的图表:


现在,我意识到我还有其他方法可以做到这一点(例如,更改原始
ScoreDistribution
对象的内容,而不是完全替换它),但我不明白为什么它在当前形式下会出错。有人能帮忙吗?

你所做的应该有用。事实上,它并不表示WPF工具包有一个bug

WPF Toolkit在DataPointSeries上实现OnItemSourceChanged(),以检测替换ItemsSource并调用Refresh()的情况。Refresh()的代码用于删除所有数据点(已设置动画的数据点除外),然后创建一组全新的数据点。显然,代码中有一个bug。我看了一两分钟,但没发现出什么问题。我将首先升级到最新的WPFToolkit版本。如果这还不能解决问题,那么在更改ItemsSource时,您可以单步执行DataPointSeries.Refresh()方法,以查看那里发生了什么以及为什么不删除旧的DataPoint对象


或者,正如您所观察到的,您可以通过只替换集合内容而不是整个集合来解决此问题。

结果表明,问题是由图表中的更新频率触发的,而不是整个系列被替换的事实;将databound属性更改为
ObservableCollection
没有任何区别

最后,我们修改了代码,在对基础数据的更改和那些反映在ViewModel的绑定集合属性中的更改之间加入了延迟。虽然这在一定程度上取决于运行应用程序的机器的速度,但我们已经确定在最后一次基础数据更改和ViewModel属性更新之间有0.5秒的延迟。这可以防止图表每0.5秒更新一次以上,而且它似乎可以完成这项工作


在某个时候,我会仔细检查WPFToolkit代码,看看我能做些什么来修复它,但是现在,这个解决方法值得注意。

我也遇到了同样的问题。更改DataPointSeries的ItemsSource时,旧数据点没有从图表中删除

我在WPF工具包(DataPointSeries.cs)中的解决方法

LoadDataPoints()
中的
for
而不是
foreach
循环,因为我们更改了集合:

for (int i = oldItems.Count - 1; i >= 0; i--)
OnDataPointStateChanged()
中的
if
更改为:

if (dataPoint.State == DataPointState.Hidden || dataPoint.State == DataPointState.PendingRemoval)
这样,数据点将立即被删除

编辑

我还必须禁用DataPoint动画,如上所述

避免此问题的最简单方法是将带有IsAsync的serie ItemSource绑定为True

ItemsSource="{Binding DataItems, IsAsync=True}"

你的变通方法很有效。我在工具包的WinRT editon中也遇到了同样的错误。谢谢。@freundblase我也有同样的问题。我已经下载了wpf工具包的源代码,但无法编译,错误很多。你能提供你正在使用的dll吗。
ItemsSource="{Binding DataItems, IsAsync=True}"