LiveCharts SeriesCollection未显示在笛卡尔图上

时间:2019-06-23 11:56:46

标签: c# wpf mvvm livecharts

修改website's documentation上提供的代码后,我在显示SeriesCollection时遇到了麻烦。让我告诉你我做了什么。

首先,XAML:

import axios from "axios";
const KEY = "";

const getPlayListItems = async playlistID => {
    const result = await axios.get(`https://www.googleapis.com/youtube/v3/playlistItems`, {
      params: {
        part: 'id,snippet',
        maxResults: 10,
        playlistId: playlistID
        key: KEY
      }
    });
    return result.data;
  };

  getPlayListItems("PlaylistID").then(data => {
    data.items.forEach(element => {
        console.log(element.snippet.resourceId.videoId)
});

在ViewModel中,我有一个自定义对象,用于存储要绑定到此图表的信息,如下所示:

<Grid>
    <lvc:CartesianChart Series="{Binding GraphData.SeriesCollection}"
                    LegendLocation="Top">
        <lvc:CartesianChart.AxisY>
            <lvc:Axis Title="VIs"></lvc:Axis>
        </lvc:CartesianChart.AxisY>
        <lvc:CartesianChart.AxisX>
            <lvc:Axis Title="Players"></lvc:Axis>
        </lvc:CartesianChart.AxisX>
    </lvc:CartesianChart>
</Grid>

我有一个按钮来测试我的代码。单击它会执行以下代码:

public GraphModel GraphData { get; set; } = new GraphModel();

出于所有意图和目的,上面的代码将两个确定为有效的双打添加到两个列表中(所以这不是问题; SeriesCollection不是空的!)

接下来是GraphModel。这是个大问题,可能是问题所在,但我无法确定问题所在:

private void UpdateGraphStatistics()
{
    var compdata = new List<double>();
    var dqdata = new List<double>();

    foreach (var item in Competitors)
    {
        if (!item.DQ)
        {
            compdata.Add(item.VIs);
        }
        else if (item.DQ)
        {
            dqdata.Add(item.VIs);
        }
    }

    GraphData = new GraphModel(compdata, dqdata);
}

以前在非WPF代码中使用了方法class GraphModel { public ChartValues<ObservablePoint> CompetitionData = new ChartValues<ObservablePoint>(); public ChartValues<ObservablePoint> DQData = new ChartValues<ObservablePoint>(); public SeriesCollection SeriesCollection { get; set; } public GraphModel() { CreateSeriesCollection(); } public GraphModel(List<double> competitionData, List<double> dqData) { ParseData(competitionData, dqData); CreateSeriesCollection(); } private void CreateSeriesCollection() { SeriesCollection = new SeriesCollection { new LineSeries { Title = "Competition Data (VIs/Player Number)", Values = CompetitionData, LineSmoothness = 0.6, PointForeground = Brushes.Blue }, new LineSeries { Title = "DQ Data (VIs/Player Number)", Values = DQData, LineSmoothness = 1, PointForeground = Brushes.Red } }; } private void ParseData(List<double> compData, List<double> dqData) { // Convert competitionData into observable points int count = 1; foreach (var item in compData) { CompetitionData.Add(new ObservablePoint(count++, item)); } // Convert dqdata into observable points int offsetX = CompetitionData.Count; foreach (var item in dqData) { DQData.Add(new ObservablePoint(offsetX++, item)); } } } ,所以我知道这不太可能成为问题的原因。

我仍然没有解决问题所在。我不能正确绑定我的数据吗?

编辑

对于上下文,我知道ParseData()中的SeriesCollection也肯定包含我想要的信息,因为它应该与我最初使用的非WPF版本的软件大致相同,因此应该如此试穿了。

1 个答案:

答案 0 :(得分:0)

我解决了自己的问题。问题是,每次我想更新图形数据时都运行相同的方法(如上所示):

private void UpdateGraphStatistics()
{
    var compdata = new List<double>();
    var dqdata = new List<double>();

    foreach (var item in Competitors)
    {
        if (!item.DQ)
        {
            compdata.Add(item.VIs);
        }
        else if (item.DQ)
        {
            dqdata.Add(item.VIs);
        }
    }

    GraphData = new GraphModel(compdata, dqdata);
}

此代码的问题在于它创建了一个新对象,该对象实际上切断了View与GraphData的绑定。

我面临两个选择:不创建新对象,或创建新对象,然后将视图重新绑定到该对象。

由于我一直无法弄清楚如何很好地重新绑定视图,因此我选择了在对象内创建方法以修改数据的选项。我做到了:

public void ParseData(List<CompetitorModel> compData, List<CompetitorModel> dqData)
{
    CompetitionData.Clear();
    DQData.Clear();

    // Convert competitionData into observable points
    int count = 0;
    foreach (var item in compData)
    {
        CompetitionData.Add(new ObservablePoint(count++, item.VIs));
    }


    // Convert dqdata into observable points
    int offsetX = compData.Count;
    foreach (var item in dqData)
    {
        DQData.Add(new ObservablePoint(offsetX++, item.VIs));
    }
}

简而言之,我将处理对象内数据丢失的代码部分公开,它清除了内部的集合,并构造了一个新的,修改了仍绑定到视图的现有Seri​​esCollection。通过更改CompetitionDataDQData集合,而不会破坏绑定。

一旦我学会了如何重新绑定数据,我就会 COULD 将此方法设为私有,并简单地创建一个新对象,但随后我还将创建整个SeriesCollection(以及我拥有的其他Funcs和其他东西)因此,此方法从理论上讲可能是更快的过程。