我目前正在我的应用中重新编码条形图,以便使用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>
现在,我意识到还有其他方法可以做到这一点(例如,更改原始ScoreDistribution.ClassScores
对象的内容而不是完全替换它),但我不明白为什么它的当前出错了形成。有人可以帮忙吗?
答案 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对象。
或者,正如您所观察到的,您可以通过仅替换集合内容而不是整个集合来解决错误。