如何刷新ScatterLineSeries?

问题描述 投票:0回答:1

关于UWP的Telerik UI控件的两个问题

在UWP应用程序中,我有一个RadCartesianChart控件。使用ScatterLine和ScatterArea系列。将ItemsSource设置为ObservableCollection,Contained Objects是具有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填充到值,但是我的数据我有负值,因此填充区域从曲线到顶部看起来,我想得到填充,从曲​​线到negativeInfinity。 Filled area is up!!谢谢!

uwp telerik
1个回答
0
投票

由于您的代码示例仍然不完整。我只是做了一个简单的代码示例来测试。当Binding在'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;
}
© www.soinside.com 2019 - 2024. All rights reserved.