DynamicDataDisplay ChartPlotter удалить все графики

В моем приложении WPF у меня есть D3 ChartPlotter, где я смог построить 4 LineGraphs. Это код XAML:

<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, так и в Интернете.

Любое предложение о том, что делать или где искать?

Спасибо!

3 ответа

Решение

Лучший способ, который я нашел для этого, - это иметь в своем коде свойство, представляющее источник данных, и привязывать источник данных диаграммы к этому свойству. Сделайте так, чтобы ваш код реализовывал 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: Обсуждения

Ну, есть простой способ сделать это. Если ваша цель - удалить каждый график в плоттере, просто сделайте это:

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

Надеюсь, что это полезно для вас.

У меня была похожая проблема. В D3 есть несколько разных типов графиков. Например, когда вы используете ElementMarkerPoints, вы должны удалить RemoveAll((typeof(MarkerPointGraph)).

Узнайте, какой тип графика вы используете, затем вы можете удалить все графики.

РЕДАКТИРОВАТЬ:

Не удаляйте графики с плоттера. Используйте ObservableDataSource и удалите значения, когда вам нужно очистить плоттер. Если я правильно помню, в противном случае вы рискуете получить утечку памяти, потому что графики не являются сборщиком мусора. ObservableDataSource имеет свойство Collection, просто вызовите метод Clear, и все хорошо:)

Другие вопросы по тегам