2012-10-30 54 views
4

在我的WPF應用程序中,我有一個D3 ChartPlotter,我可以繪製4個LineGraphs。這是XAML代碼:DynamicDataDisplay ChartPlotter刪除所有地塊

<d3:ChartPlotter Name="plotter"> 
    <d3:ChartPlotter.HorizontalAxis> 
     <d3:HorizontalAxis Name="timeAxis" /> 
    </d3:ChartPlotter.HorizontalAxis> 
    <d3:ChartPlotter.VerticalAxis> 
     <d3:VerticalAxis Name="accelerationAxis" /> 
    </d3:ChartPlotter.VerticalAxis> 
</d3:ChartPlotter> 

其中d3是DinamicDataDisplay命名空間,這就是(相關部分)後面的代碼。

var x = new List<int>(); 
var y = new List<int>(); 
for (var t = 0; t <= 10; t = t + 1) { 
    x.Add(t); 
    y.Add(Math.Pow(t,2)); 
} 

var xCoord = new EnumerableDataSource<int>(x); 
xCoord.SetXMapping(t => t); 
var yCoord = new EnumerableDataSource<int>(y); 
yCoord.SetYMapping(k => k); 

CompositeDataSource plotterPoints = new CompositeDataSource(xCoord, yCoord); 

plotter.AddLineGraph(plotterPoints, Brushes.Red.Color , 2, "MyPlot"); 

我現在要做的就是刪除這個圖並使用不同的點集重新繪製它。不幸的是,我無法在D3和(網絡)的(窮人)文檔中找到那個方向的任何內容。

任何有關該做什麼或在哪裏尋找的建議?

謝謝!

回答

2

我發現要做到這一點的最好方法是在代碼後面有一個代表DataSource並將圖表的DataSource綁定到該屬性的Property。每次更新或重新分配數據源時,讓您的代碼實現INotifyPropertyChanged並調用OnPropertyChanged。這將迫使繪圖儀觀察綁定並重新繪製您的圖形。

例子:

EnumerableDataSource<Point> m_d3DataSource; 
public EnumerableDataSource<Point> D3DataSource { 
    get { 
     return m_d3DataSource; 
    } 
    set {     
     //you can set your mapping inside the set block as well    
     m_d3DataSource = value; 
     OnPropertyChanged("D3DataSource"); 
    } 
}  

protected void OnPropertyChanged(PropertyChangedEventArgs e) { 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) { 
     handler(this, e); 
    } 
} 

protected void OnPropertyChanged(string propertyName) { 
    OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
} 

如果你需要更多信息,我能找到的最好的資源是CodePlex上討論,有D3位於: Discussions

+0

謝謝你的回答,@Jason。由於我對所有D3事物(以及一般的WPF)都很陌生,請問您能否使用XAML代碼的示例?我必須綁定單個'xCoord'和'yCoord',還是CompositeDataSource就夠了? – Cynical

+0

好吧,我想我已經解決了,在討論@Jason Higgins中提到的更深入: private void ClearPlotter(){{ MarkerPointsGraph).ToArray()){this.plotter.Children.Remove(elem); } } 您認爲這是一個很好的解決方案嗎? – Cynical

+0

如果您的意思是清除該圖以顯示新數據,則不需要刪除所有元素!只需將您創建的DataSource屬性設置爲新集合,然後調用Property Changed Event,然後它將自動更新綁定。如果你的意思是隻清除你的圖並且不顯示任何數據,把你的DataSource設置爲一個空集合。即。 D3DataSource = new EnumerableDataSource (new object [0]); –

1

也有一個簡單的方法來做到這一點。如果你的目的是要刪除繪圖儀每個圖形簡單的做到這些:

plotterName.Children.RemoveAll((typeof(LineGraph)); 

希望這是對你有用。

0

我有一個類似的問題。 D3中有幾種不同的圖形類型。例如,當您使用ElementMarkerPoints,你要的removeAll((typeof運算(MarkerPointGraph))

找出您使用的圖表類型,那麼你可以刪除所有地塊

編輯:。

唐從繪圖儀中刪除圖形,使用ObservableDataSource並在需要清除繪圖儀時刪除這些值當我記得正確時,否則會冒內存泄漏的風險,因爲這些圖形不是垃圾收集的。稱爲收集,只需調用清除方法,你很好:)