我正在尝试生成一个图形,并且x轴和y轴显示范围由我的c#代码中的计算数据定义。我想将x轴范围设置为以特定值(SpotValue)为中心的50,我想将y轴范围设置在lineseries显示的数据的最小值和最大值之间。
我使用相同的方法来绑定轴范围但由于某种原因它适用于x轴但不适用于y轴。真正奇怪的是,如果我用数字替换CallDeltaVector.Min()
和CallDeltaVector.Max()
,图表会选择正确的y轴范围。
我似乎无法弄清楚为什么它不能使用.Min()
和.Max()
函数。我试过彻底搜索,并没有在任何地方找到类似的问题。任何帮助将不胜感激。
我有以下XAML
<charting:Chart
x:Name="CallDeltaGraph" Title="Call Delta"
Background="Black" Foreground="WhiteSmoke"
FontWeight="Bold" BorderBrush="WhiteSmoke"
BorderThickness="3" Width="350" Height="350"
VerticalAlignment="Top" HorizontalAlignment="Left"
Margin="786,82,0,0">
<charting:Chart.LegendStyle>
<Style TargetType="Control">
<Setter Property="Width" Value="0" />
<Setter Property="Height" Value="0" />
</Style>
</charting:Chart.LegendStyle>
<charting:Chart.Axes>
<charting:LinearAxis
x:Name="CallDeltaGraphXAxis"
Orientation="X" Minimum="{Binding Path=Key}"
Maximum="{Binding Path=Value}" ShowGridLines="True"/>
<charting:LinearAxis
x:Name="CallDeltaGraphYAxis"
Orientation="Y" Minimum="{Binding Path=Key}"
Maximum="{Binding Path=Value}" ShowGridLines="True" />
</charting:Chart.Axes>
<charting:Chart.Series>
<charting:LineSeries
IndependentValueBinding="{Binding Path=Key}"
DependentValueBinding="{Binding Path=Value}" />
</charting:Chart.Series>
</charting:Chart>
我有以下c#代码:
KeyValuePair<double, double>[] XRange = new KeyValuePair<double, double>[1];
XRange[0] = new KeyValuePair<double, double>(Math.Floor(SpotPrice) - 25, Math.Ceiling(SpotPrice) + 25);
CallDeltaGraphXAxis.DataContext = XRange;
KeyValuePair<double, double>[] CallDeltaYRange = new KeyValuePair<double, double>[1];
CallDeltaYRange[0] = new KeyValuePair<double, double>(CallDeltaVector.Min(), CallDeltaVector.Max());
CallDeltaGraphYAxis.DataContext = CallDeltaYRange;
答案 0 :(得分:3)
嗯......非常困惑你的代码...首先,你使用KeyValuePair<double, double>
然后将其用作key
- value
,但这些确实是Min
和Max
,因此会产生误导。
其次,你有这个:
Minimum="{Binding Path=Key}" Maximum="{Binding Path=Value}"
所以绑定会查找名为Key
的属性和一个名为Value
的属性,但是你没有它们......你拥有的是key
和{{1在value
。
我想你可以绑定到KeyValuePair
,并将KeyValuePair
或key
作为相对路径,以及:
value
或者更好:拥有一个名为 <Binding ElementName=your_object, Path=key_or_value>
的属性,一个名为MinVal
的属性,并绑定到它们......
答案 1 :(得分:1)
如果你改变了
KeyValuePair<double, double>[] CallDeltaYRange = new KeyValuePair<double, double>[1];
CallDeltaYRange[0] = new KeyValuePair<double, double>(CallDeltaVector.Min(), CallDeltaVector.Max());
CallDeltaGraphYAxis.DataContext = CallDeltaYRange;
而是创建此类的实例...
CallDeltaYRangeInfo cvRange = new CallDeltaYRangeInfo{Ymax = CallDeltaVector.Max(), Ymin = CallDeltaVector.Min()};
将类定义为......
public class CallDeltaYRangeInfo : INotifyPropertyChanged
{
private double _yMin;
public double Ymin
{
[DebuggerStepThrough]
get { return _yMin; }
[DebuggerStepThrough]
set
{
if (Math.Abs(value - _yMin) > 1e-6)
{
_yMin = value;
OnPropertyChanged("Ymin");
}
}
}
private double _yMax;
public double Ymax
{
[DebuggerStepThrough]
get { return _yMax; }
[DebuggerStepThrough]
set
{
if (Math.Abs(value - _yMax) > 1e-6)
{
_yMax = value;
OnPropertyChanged("Ymax");
}
}
}
#region INotifyPropertyChanged Implementation
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string name)
{
var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
#endregion
}
...然后您可以将CallDeltaGraphYAxis.DataContext分配给该实例,您将看到更好的结果。
<charting:LinearAxis x:Name="CallDeltaGraphYAxis" Orientation="Y" Minimum="{Binding Ymin}" Maximum="{Binding Ymax}" ShowGridLines="True" />