关于用于UWP的Telerik UI控件的两个问题
在UWP应用中,我有一个RadCartesianChart控件。具有ScatterLine和ScatterArea系列。将ItemsSource设置为ObservableCollection,包含的对象是具有X和Y属性的简单对象,具有INotifyPropertyChanged接口,因此,当X或Y属性更新时,它们将触发更改值事件。 X和Y值绑定都设置为ScatterLineSeries中的相应属性
现在,我知道源是一个ObservableCollection,当我向集合中添加或删除点时,图表控件会自动更新,但是当我修改点的值时如何刷新图表?控制重新查询数据源? 下面是数据点类。
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只是实数部分和imag部分都使用十进制类型的复数结构)
旁边还有一个小问题,使用ScatterArea,面积从0填充到值,但是对于我的数据,我的数值为负,所以填充的区域从曲线到顶部,我想从曲线为negativeInfinity。
谢谢!
答案 0 :(得分:0)
由于您的代码样本仍然不完整。我只是做了一个简单的代码示例进行测试。当绑定在“ 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;
}