Как получить доступ к индексу при использовании Mappers.Xy‹double› с вертикальными сериями?

Я пытаюсь понять класс Mappers.XY, используя вертикальный ряд, основанный на двойниках. Чтобы проверить это, я хочу, чтобы все четные индексы оси Y были заполнены красным, но .Fill, похоже, использует только значения X. Вот код, который у меня есть, и результаты:

var RedBrush = new SolidColorBrush(Color.FromRgb(238, 83, 80));

Mapper = Mappers.Xy<double>()
    .X((value, index) => value)
    .Y((value, index) => index)
    .Fill(index => index % 2 == 0 ? RedBrush : null)
    .Stroke(index => index % 2 == 0 ? RedBrush : null);

Я получаю красные полосы только тогда, когда значение X даже, как показано здесь: Красные значения X Я даже изменил .Fill, чтобы он основывался на значении, но без изменений.

РЕДАКТИРОВАТЬ: я думаю, что сузил проблему до использования метода по умолчанию для .Fill, который:

public CartesianMapper<T> Fill(Func<T, object> predicate);

Я думаю, что это использует двойное значение в качестве основы для заполнения, которое в моем случае будет X-значениями. Вместо этого я должен использовать перегрузку для .Fill, которая, кажется, рассматривает индекс как int... чего я и хочу:

 public CartesianMapper<T> Fill(Func<T, int, object> predicate);

Проблема в том, что я не уверен, как это использовать. Вместо того, чтобы иметь:

.Fill(index => index % 2 == 0 ? RedBrush : null)

что это должно быть? Мои навыки лямбды находятся на уровне новичка.

*** ПРЕДЫДУЩИЙ ТЕКСТ, КОТОРЫЙ МОЖНО ИГНОРИРОВАТЬ...

Я просмотрел типы и конфигурации для помощи здесь: https://lvcharts.net/App/examples/v1/wpf/Types%20and%20Configuration и, в частности, я пытаюсь адаптировать эти две концепции к своей собственной:

  1. На уровне коллекции серий

Когда вы определяете экземпляр коллекции Series, вы также можете передать конфигурацию по умолчанию, эта конфигурация переопределяет глобальную конфигурацию и будет установлена, только если конфигурация Series имеет значение null:

  var mapper = Mappers.Xy<MyClass>().X(v => v.XProp).Y(v => v.YProp);
  var seriesCollection = new SeriesCollection(mapper);
  myChart.SeriesCollection = seriesCollection;
  1. В конкретной серии

Наконец, вы также можете определить маппер только для серии, это переопределит конфигурацию >globally и SeriesCollection:

var mapper = Mappers.Xy<MyClass>().X(v => v.XProp).Y(v => v.YProp);
var pieSeries = new PieSeries(mapper);

Проблема в том, что в примерах используются ObservablePoints со свойствами, которых у меня нет, потому что я просто использую двойники.

Кто-нибудь знает, возможно ли это сделать, используя только двойники? Любые альтернативы?


person hillborne    schedule 16.11.2017    source источник
comment
Пробовали ли вы .X(значение => значение) вместо .X ((значение, индекс) => значение) для вашего Mapper в первом примере?   -  person AlBal    schedule 18.11.2017
comment
Да, без изменений. Но я думаю, проблема в том, что я не использую правильную перегрузку для .Fill. Метод по умолчанию: public CartesianMapper‹T› Fill (Func‹T, object› предикат); который использует ‹double› для оценки и заполнения. Я хочу использовать следующую перегрузку: public CartesianMapper‹T› Fill(Func‹T, int, object› predicate); Что, кажется, разрешает доступ к индексу как int. Проблема в том, что я не знаю, как им пользоваться. Вместо: .Fill(index => index % 2 == 0 ? RedBrush : null), что мне использовать? Спасибо!   -  person hillborne    schedule 19.11.2017
comment
Исправлено - смотрите ответ ниже.   -  person AlBal    schedule 22.11.2017


Ответы (1)


Вам нужно изменить лямбда-выражение для .Fill следующим образом:

    var Mapper = Mappers.Xy<double>()
            .X((value, index) => value)
            .Y((value, index) => index)
            .Fill((value, index) => index % 2 == 0 ? RedBrush : null);

По какой-то причине в вашем выражении кажется, что лямбда-выражение оценивало значение% 2 вместо индекса% 2.

Ниже приведено изображение диаграммы ряда строк с использованием картографа: Диаграмма ряда строк

person AlBal    schedule 21.11.2017