Как обновить ScatterLineSeries? - PullRequest
0 голосов
/ 27 февраля 2019

Два вопроса об элементах управления Telerik UI для UWP

В приложении UWP у меня есть элемент управления RadCartesianChart.С сериями ScatterLine и ScatterArea.Если для ItemsSource установлено значение ObservableCollection, содержащиеся объекты являются простыми объектами со свойствами X и Y с интерфейсом INotifyPropertyChanged, поэтому при обновлении свойств X или Y они запускают события значений изменений.Для привязок значений X и Y установлены соответствующие свойства в ScatterLineSeries

Теперь я понимаю, что источником является ObservableCollection, элемент управления диаграммой обновляется автоматически при добавлении или удалении точки в коллекцию, но какОбновить диаграмму, когда я изменяю значения точки? Как попросить элемент управления диаграммы повторно запросить источники данных?Ниже приведен класс Data Point.

public class DataPoint : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private decimal x;
    private ComplexDecimal y;

    public decimal X { get => x; set { x = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("X")); } }
    public ComplexDecimal Y
    {
        get => y; set
        {
            y = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Y"));
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("PhaseDegDouble"));
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("dBV"));
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("dBm"));
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("dBSPL"));
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Magnitude"));
        }
    }

    public double PhaseDegDouble { get => Y.PhaseDegDouble; }
    public double dBV { get => Y.TodBV; }
    public double dBSPL { get => Y.TodBSPL; }
    public double dBm { get => Y.TodBm; }
    public double Magnitude { get => Convert.ToDouble(Y.Magnitude); }

}

Итак, у меня есть функциональный объект с полем ObservableCollection Data. Я делаю ScatterLineSeries.

var lineMag = new ScatterLineSeries()
{
ItemsSource = function.Data,
XValueBinding = new PropertyNameDataPointBinding("X"),
YValueBinding = new PropertyNameDataPointBinding("dBV"),
};

и добавляю его в диаграмму с помощью
rcChart.Series.Add(lineMag);

Если я это сделаю:

function.Data.Add(new DataPoint(){X=30,Y=new ComplexDecimal(1,1)});

добавляется точка.Но если я это сделаю:

function.Data[0].Y = new ComplexDecimal(1,1);

график не обновляется.Как обновить диаграмму при изменении существующей DataPoint?(ComplexDecimal - это просто структура для комплексного числа, использующего десятичный тип как для вещественной, так и для отображаемой части)

И небольшой вопрос, кроме того, с ScatterArea, площадь заполняется от 0 до значения, но с моими данными у меня отрицательные значения,и поэтому заполненная область выглядит от кривой к вершине, я хотел бы получить заливку, от кривой до негативной бесконечности.Filled area is up!! Спасибо!

1 Ответ

0 голосов
/ 28 февраля 2019

Поскольку пример кода по-прежнему неполон.Я только что сделал простой пример кода для тестирования.Когда привязка работает на элементе управления RadCartesianChart, я затем обновил значения XValue и YValue из коллекции.Тогда нет проблем.Диаграмма будет обновлена.

Пожалуйста, посмотрите мой пример кода:

<Grid>
    <telerikChart:RadCartesianChart x:Name="scatterLineSeries">
        <telerikChart:RadCartesianChart.VerticalAxis>
            <telerikChart:LinearAxis/>
        </telerikChart:RadCartesianChart.VerticalAxis>
        <telerikChart:RadCartesianChart.HorizontalAxis>
            <telerikChart:LinearAxis/>
        </telerikChart:RadCartesianChart.HorizontalAxis>

        <telerikChart:ScatterLineSeries ItemsSource="{Binding}">
            <telerikChart:ScatterLineSeries.XValueBinding>
                <telerikChart:PropertyNameDataPointBinding PropertyName="XValue"/>
            </telerikChart:ScatterLineSeries.XValueBinding>
            <telerikChart:ScatterLineSeries.YValueBinding>
                <telerikChart:PropertyNameDataPointBinding PropertyName="YValue"/>
            </telerikChart:ScatterLineSeries.YValueBinding>
        </telerikChart:ScatterLineSeries>
    </telerikChart:RadCartesianChart>

    <Button Content="update" Click="Button_Click"></Button>
</Grid>
public sealed partial class MainPage : Page
{
    ObservableCollection<Data> sampleData;
    public MainPage()
    {
        this.InitializeComponent();
        sampleData = new ObservableCollection<Data>();
        sampleData.Add(new Data() { XValue = 2, YValue = 3 });
        sampleData.Add(new Data() { XValue = 3, YValue = 4 });
        sampleData.Add(new Data() { XValue = 4, YValue = 5 });
        sampleData.Add(new Data() { XValue = 5, YValue = 6 });
        sampleData.Add(new Data() { XValue = 6, YValue = 5 });
        sampleData.Add(new Data() { XValue = 7, YValue = 4 });
        sampleData.Add(new Data() { XValue = 8, YValue = 3 });
        sampleData.Add(new Data() { XValue = 9, YValue = 4 });
        sampleData.Add(new Data() { XValue = 10, YValue = 5 });
        sampleData.Add(new Data() { XValue = 11, YValue = 4 });
        sampleData.Add(new Data() { XValue = 12, YValue = 3 });
        sampleData.Add(new Data() { XValue = 13, YValue = 2 });
        sampleData.Add(new Data() { XValue = 14, YValue = 1 });

        this.scatterLineSeries.DataContext = sampleData;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        sampleData[0].XValue = 10;
        sampleData[0].YValue = 5;
    }
}
public class Data : INotifyPropertyChanged
{
    private double xValue;
    public double XValue
    {
        get => xValue;
        set
        {
            xValue = value;
            PropertyChanged?.Invoke(this,new PropertyChangedEventArgs("XValue"));
        }
    }

    private double yValue;
    public double YValue
    {
        get => yValue;
        set
        {
            yValue = value;
            PropertyChanged?.Invoke(this,new PropertyChangedEventArgs("YValue"));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}
...