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

时间:2010-06-14 16:50:39

标签: wpf binding charts wpftoolkit

我目前正在我的应用中重新编码条形图,以便使用WPF Toolkit中的Chart课程。使用MVVM,我将我的图表中ItemsSource的{​​{1}}绑定到我的viewmodel上的属性。这是相关的XAML:

ColumnSeries

viewmodel上的属性:

<charting:Chart>
  <charting:ColumnSeries ItemsSource="{Binding ScoreDistribution.ClassScores}"
                         IndependentValuePath="ClassName" DependentValuePath="Score"/>
</charting:Chart>

但是,当我更新// NB: viewmodel derived from Josh Smith's BindableObject public class ExamResultsViewModel : BindableObject { // ... private ScoreDistributionByClass _scoreDistribution; public ScoreDistributionByClass ScoreDistribution { get { return _scoreDistribution; } set { if (_scoreDistribution == value) { return; } _scoreDistribution = value; RaisePropertyChanged(() => ScoreDistribution); } } 属性(通过将其设置为新的ScoreDistribution对象)时,图表会获得其他系列(基于新的ScoreDistribution)以及保留原始系列(基于之前的ScoreDistribution)。

为了说明这一点,下面是一些屏幕截图,显示更新前的图表(ScoreDistribution中有一个数据点)及之后(现在ScoreDistribution.ClassScores中有3个数据点):< / p>

With a single data point

With 2 more data points added - note the original wide bar behind them

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

4 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。更改DataPointSeries的ItemsSource时,发生了旧的DataPoints未从图表中删除的情况。

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

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

for (int i = oldItems.Count - 1; i >= 0; i--)

if中的OnDataPointStateChanged()更改为:

if (dataPoint.State == DataPointState.Hidden || dataPoint.State == DataPointState.PendingRemoval)

这样就可以立即删除DataPoint。

修改
我还必须禁用DataPoint动画,描述为here

答案 1 :(得分:2)

避免此问题的最简单方法是将Serie ItemSsource与Async绑定为True。

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

答案 2 :(得分:1)

原来问题是由图表中更新的频率触发的,而不是整个系列被替换的事实;将数据绑定属性更改为ObservableCollection没有任何区别。

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

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

答案 3 :(得分:0)

你在做什么应该工作。事实上它并不表示WPF Toolkit有错误。

WPF Toolkit在DataPointSeries上实现OnItemsSourceChanged(),以检测替换ItemsSource并调用Refresh()的情况。 Refresh()具有删除所有数据点的代码(除了那些已经动画化的数据点),然后创建一组全新的DataPoints。显然代码中有一个错误。我看了一两分钟,但没看到出了什么问题。我将从升级到最新的WPFToolkit版本开始。如果这不能解决问题,则可以在更改ItemsSource时查看DataPointSeries.Refresh()方法,以查看其中发生的情况以及为什么不删除旧的DataPoint对象。

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