C# .Min()和.Max()函数在数据绑定期间不工作
我正在尝试生成一个图形,其中x轴和y轴的显示范围由我的c#代码中的计算数据定义。我想将x轴范围设置为以特定值(SpotValue)为中心的50,并将y轴范围设置为线系列显示的数据的最小值和最大值之间 我使用了相同的方法绑定轴范围,但出于某种原因,它适用于x轴,而不是y轴。真正奇怪的是,如果我用数字替换C# .Min()和.Max()函数在数据绑定期间不工作,c#,wpf,charts,wpftoolkit,C#,Wpf,Charts,Wpftoolkit,我正在尝试生成一个图形,其中x轴和y轴的显示范围由我的c#代码中的计算数据定义。我想将x轴范围设置为以特定值(SpotValue)为中心的50,并将y轴范围设置为线系列显示的数据的最小值和最大值之间 我使用了相同的方法绑定轴范围,但出于某种原因,它适用于x轴,而不是y轴。真正奇怪的是,如果我用数字替换CallDeltaVector.Min()和CallDeltaVector.Max(),图形将拾取正确的y轴范围 我似乎不明白为什么这不适用于.Min()和.Max()函数。我试着彻底搜索,但在任何
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[]XRange=新的KeyValuePair[1];
XRange[0]=新的KeyValuePair(数学下限(SpotPrice)-25,数学上限(SpotPrice)+25);
CallDeltaGraphXAxis.DataContext=XRange;
KeyValuePair[]CallDeltaYRange=新的KeyValuePair[1];
CallDeltaYRange[0]=新的KeyValuePair(CallDeltaVector.Min(),CallDeltaVector.Max());
CallDeltaGraphYAxis.DataContext=CallDeltaYRange;
嗯。。。你的代码很难理解。。。首先,您使用KeyValuePair
,然后将其用作key
-value
,但它们实际上是Min
和Max
,因此它具有误导性
第二,你有:
Minimum="{Binding Path=Key}" Maximum="{Binding Path=Value}"
因此绑定会查找一个名为Key
的属性和一个名为Value
的属性,但您没有它们。。。您拥有的是KeyValuePair
上的key
和value
我想您可以绑定到KeyValuePair
并将key
或value
作为相对路径,如下所示:
<Binding ElementName=your_object, Path=key_or_value>
或者更好:拥有一个名为
MinVal
的属性,一个名为MaxVal
的属性,并绑定到它们 嗯。。。你的代码很难理解。。。首先,您使用KeyValuePair
,然后将其用作key
-value
,但它们实际上是Min
和Max
,因此它具有误导性
第二,你有:
Minimum="{Binding Path=Key}" Maximum="{Binding Path=Value}"
因此绑定会查找一个名为Key
的属性和一个名为Value
的属性,但您没有它们。。。您拥有的是KeyValuePair
上的key
和value
我想您可以绑定到KeyValuePair
并将key
或value
作为相对路径,如下所示:
<Binding ElementName=your_object, Path=key_or_value>
或者更好:拥有一个名为MinVal
的属性,一个名为MaxVal
的属性,并绑定到它们 如果你改变
KeyValuePair<double, double>[] CallDeltaYRange = new KeyValuePair<double, double>[1];
CallDeltaYRange[0] = new KeyValuePair<double, double>(CallDeltaVector.Min(), CallDeltaVector.Max());
CallDeltaGraphYAxis.DataContext = CallDeltaYRange;
其中类的定义如下
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" />
如果您更改
KeyValuePair<double, double>[] CallDeltaYRange = new KeyValuePair<double, double>[1];
CallDeltaYRange[0] = new KeyValuePair<double, double>(CallDeltaVector.Min(), CallDeltaVector.Max());
CallDeltaGraphYAxis.DataContext = CallDeltaYRange;
其中类的定义如下
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" />
@Noctis,这不是搭便车。合成和获得一个干净的编译需要更长的时间。非常感谢你们!真的非常感谢:)我明天第一件事就是试试这个。@user3638784,全部都是服务的一部分,不需要感谢。这是你在这个网站上的第一个问题,所以我建议你阅读@Noctis,这不是一个提升。合成和获得一个干净的编译需要更长的时间。非常感谢你们!真的非常感谢:)我明天第一件事就是试试这个。@user3638784,全部都是服务的一部分,不需要感谢。这是你在网站上的第一个问题,所以我建议你阅读