C# .Min()和.Max()函数在数据绑定期间不工作

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()函数。我试着彻底搜索,但在任何

我正在尝试生成一个图形,其中x轴和y轴的显示范围由我的c#代码中的计算数据定义。我想将x轴范围设置为以特定值(SpotValue)为中心的50,并将y轴范围设置为线系列显示的数据的最小值和最大值之间

我使用了相同的方法绑定轴范围,但出于某种原因,它适用于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[]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,全部都是服务的一部分,不需要感谢。这是你在网站上的第一个问题,所以我建议你阅读