LiveCharts SeriesCollection не отображается на декартовой диаграмме - PullRequest
1 голос
/ 23 июня 2019

После изменения кода, приведенного в документации на веб-сайте , у меня возникли проблемы с отображением SeriesCollection.Позвольте мне показать вам, что я сделал.

Во-первых, XAML:

<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>

В моей ViewModel у меня есть пользовательский объект, хранящий информацию, которую я хочу привязать к этой диаграмме как:

public GraphModel GraphData { get; set; } = new 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);
}

Для всех намерений и целей, этот код выше добавляет к двум спискам серию парных чисел, которые, как я определил, работает (так что это не проблема;SeriesCollection не пустой!)

Далее, GraphModel.Это большая проблема, в которой проблема, вероятно, кроется, но я не могу определить, где:

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() ранее использовался в коде, отличном от WPF, поэтому я знаю, что это вряд ли является причинойдля вопроса.

Я до сих пор не решил, что происходит не так.Я неправильно связываю свои данные?

Редактировать

Для контекста я знаю, что SeriesCollection в GraphModel определенно содержит информацию, которую я тоже хочу, как и должно быть, так как этот кодболее или менее то же самое с версией программного обеспечения не-WPF, в которой я впервые попробовал.

1 Ответ

0 голосов
/ 27 июня 2019

Я решил свою проблему. Проблема заключалась в том, что я запускал один и тот же метод каждый раз, когда хотел обновить данные графика (как показано выше):

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);
}

Проблема с этим кодом заключается в том, что он создает новый объект, который фактически разрывает привязки, которые имеет представление с 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));
    }
}

Короче говоря, я сделал общедоступным раздел кода, который касается вставки данных в моем объекте, который очищает коллекции внутри, а создает новый , модифицирующий существующую коллекцию SeriesCollection, которая все еще привязана к представлению, без нарушения привязки путем изменения коллекций CompetitionData и DQData.

Как только я узнаю, как перепривязать данные, я МОЖЕТ сделать этот метод частным и просто создать новый объект, но затем я также создаю всю коллекцию SeriesCollection (и другие функции и вещи, которые есть в моделировать) каждый раз, так что этот метод теоретически может быть быстрее с точки зрения процесса.

...