.Min()和.Max()函数在数据绑定期间不起作用

时间:2014-05-14 23:43:53

标签: c# wpf charts wpftoolkit

我正在尝试生成一个图形,并且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;

2 个答案:

答案 0 :(得分:3)

嗯......非常困惑你的代码...首先,你使用KeyValuePair<double, double>然后将其用作key - value,但这些确实是MinMax,因此会产生误导。

其次,你有这个:

Minimum="{Binding Path=Key}" Maximum="{Binding Path=Value}"

所以绑定会查找名为Key的属性和一个名为Value的属性,但是你没有它们......你拥有的是key和{{1在value

我想你可以绑定到KeyValuePair,并将KeyValuePairkey作为相对路径,以及:

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" />