Как использовать AutoSeriesGenerator с MVVM Visiblox
Я следую примеру из этого урока: но, к сожалению, их документация настолько расплывчата, что я не могу заставить что-либо работать должным образом.
http://www.visiblox.com/blog/posts/2011/06/13/data-binding-with-visiblox-charts/
То, что я пытаюсь сделать, это использовать AutoSeriesGenerator, чтобы автоматически создать для меня новую серию, а также добавить эту серию строк в основную ось Y. Я надеюсь, что некоторые из вас имеют хороший опыт с Visiblox. Вот как я думал, их пример должен быть представлен в C#:
<local:WeatherStationsData x:Key="dataCollection">
<local:WeatherStationTemperature>
<local:HourTemperature Hour="1" Temperature="10" />
<local:HourTemperature Hour="2" Temperature="14" />
</local:WeatherStationTemperature>
<local:WeatherStationTemperature>
<local:HourTemperature Hour="1" Temperature="20" />
<local:HourTemperature Hour="2" Temperature="19" />
</local:WeatherStationTemperature>
</local:WeatherStationsData>
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<charts:Chart x:Name="Chart"
charts:AutoSeriesGenerator.XValuePath="Hour"
charts:AutoSeriesGenerator.YValuePath="Temperature"
charts:AutoSeriesGenerator.ChartSeriesProvider="LineSeries"
charts:AutoSeriesGenerator.ItemsSource="{StaticResource dataCollection}">
<charts:Chart.XAxis>
<charts:LinearAxis />
</charts:Chart.XAxis>
<charts:Chart.YAxis>
<charts:LinearAxis />
</charts:Chart.YAxis>
</charts:Chart>
//X and Y points
public class ChartDataPoint
{
public DateTime X { get; set; }
public float Y { get; set; }
public ChartDataPoint(DateTime X, float Y)
{
this.X = X;
this.Y = Y;
}
}
//represents a dataseries - collection of datapoints
public class DataPointsCollection : ObservableCollection<ChartDataPoint>
{
}
//the "dataseries"
public class DataSeries : ObservableCollection<DataPointsCollection>
{
}
But it isn't working as expected.
public IChartSeries CreateSeries(object targetParent, object boundObject)
{
LineSeries lineSeries = null;
if (targetParent is LineSeries)
{
lineSeries = new LineSeries();
lineSeries.YAxis = new LinearAxis();
AxisCollection.Add(lineSeries.YAxis);
}
return lineSeries;
}
В их документации говорится, что targetObject - это бизнес-объект, на который обернут IChartSeries. Но то, что я получаю вместо объекта, это коллекция! И этот метод всегда вызывается несколько раз, что означает, что он генерирует много Lineseries. Я пробовал событие CollectionChanged, и это та же проблема. Он не вызывается один раз, а вызывается несколько раз, что не имеет смысла для меня.
Как я могу решить эту проблему, спасибо.
1 ответ
Это довольно неловко, так как я боролся с этим весь день. Ненавижу, когда я пишу вопрос, а потом решаю его через несколько минут после:O.
Я решил попробовать это, и это сработало - очень медленно!:(
В вашем коде позади:
private void Series_CollectionChanged(object sender,
NotifyCollectionChangedEventArgs e)
{
if(e.Action == NotifyCollectionChangedAction.Add)
{
var lineSeries = (LineSeries) MultiChart.Series[e.NewStartingIndex];
if (!collection.Contains(lineSeries.YAxis))
{
lineSeries.YAxis = new LinearAxis();
collection.Add(lineSeries.YAxis);
}
}
else if(e.Action == NotifyCollectionChangedAction.Reset )
{
collection.Clear();
}
}
В вашей CustomLineSeries или что-то еще:
public IChartSeries CreateSeries(object targetParent, object boundObject)
{
if (boundObject is DataPointsCollection)
{
LineSeries lineSeries = new LineSeries();
return lineSeries;
}
return null;
}
Я должен был убедиться, что связанный объект является бизнес-объектом, и да!