2010-06-14 48 views
3

我目前在我的應用程序中重新編碼條形圖以利用WPF Toolkit中的Chart類。使用MVVM,我將圖表中的ColumnSeriesItemsSource綁定到我的viewmodel上的一個屬性。下面是相關的XAML:綁定更新將新聞系列添加到WPF工具包圖表(而不是替換/更新系列)

<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的單個數據點)之前和之後的(現在與ScoreDistribution.ClassScores 3個數據點):

With a single data point

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

現在,我知道有其他的方法,我可以這樣做(例如,改變原來的ScoreDistribution對象的內容,而不是完全取代它),但我不明白爲什麼它在其目前的FO腳麻R M。誰能幫忙?

回答

1

原來問題是由圖表中更新的頻率觸發的,而不是整個系列被替換的事實;將數據綁定屬性更改爲ObservableCollection沒有任何區別。

最後,我們更改了代碼,以便在對底層數據進行更改之間包含延遲,並將這些更改反映到ViewModel的綁定集合屬性中。儘管它的運行速度取決於應用程序的運行速度,但我們已經確定了最後一個基礎數據更改和ViewModel屬性更新之間的0.5秒延遲。這可以防止圖表每0.5秒更新一次,它似乎能夠完成這項工作。

在某些時候,我會實際瀏覽WPFToolkit代碼,看看我能做些什麼來解決它,但現在,這個解決方法值得注意。

0

你在做什麼應該工作。它不表示WPF工具包的事實有一個錯誤。

WPF Toolkit在DataPointSeries上實現OnItemsSourceChanged()以檢測替換ItemsSource並調用Refresh()的情況。 Refresh()具有刪除所有數據點的代碼(除已經動畫化的數據點外),然後創建一組全新的DataPoints。很明顯,代碼中有一個錯誤。我看了一兩分鐘,但沒有看到什麼是錯的。我將首先升級到最新的WPFToolkit版本。如果這樣做不能解決問題,那麼當ItemsSource被更改時,您可以通過DataPointSeries.Refresh()方法來查看發生了什麼,以及它爲什麼不刪除舊的DataPoint對象。

或者,正如您所觀察到的那樣,您可以通過更換集合內容而不是整個集合來解決該問題。

2

我有同樣的問題。當更改DataPointSeries的ItemsSource時,它發生的事情是舊的DataPoints沒有從圖表中刪除。

我在WPF工具包(DataPointSeries.cs)解決辦法...

一個for代替LoadDataPoints()一個foreach循環,因爲我們改變集合:

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

更改ifOnDataPointStateChanged()到:

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

這樣數據點將是我馬上刪除。

編輯
我也不得不禁用數據點動畫,描述here

+0

您的解決方法效果很好。我在工具箱的WinRT editon中遇到了同樣的問題。謝謝。 – Bart 2012-11-24 12:13:31

+0

@freundblase我也有同樣的問題。我已經下載了wpf工具包的源代碼,但無法編譯它,很多錯誤。你能否提供你正在使用的DLL。 – 2015-02-25 13:17:33

2

避免此問題的最簡單方法是將系列ItemSource與IsAsync綁定爲True。

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

這不適合我。也許我錯過了什麼。 – Buck 2013-09-19 06:44:22