C# 尽管绑定到正确的数据,但XAML图表未填充线系列

C# 尽管绑定到正确的数据,但XAML图表未填充线系列,c#,wpf,xaml,charts,C#,Wpf,Xaml,Charts,我正在使用System.Windows.Controls.DataVisualization.Toolkit中的图表并绑定到类型为的对象 ObservableCollection<KeyValuePair<double, double>> observedcollection 我的图表如下图所示,屏幕截图让我在绑定源上悬停,因此我知道它绑定到了正确的对象。但是当我运行程序时,图表是完全空白的。我知道这个设置是可行的,我在另一个程序中使用了完全相同的代码,它工作得非常完

我正在使用System.Windows.Controls.DataVisualization.Toolkit中的图表并绑定到类型为的对象

ObservableCollection<KeyValuePair<double, double>>
observedcollection
我的图表如下图所示,屏幕截图让我在绑定源上悬停,因此我知道它绑定到了正确的对象。但是当我运行程序时,图表是完全空白的。我知道这个设置是可行的,我在另一个程序中使用了完全相同的代码,它工作得非常完美。我唯一能想到的就是缺少了一些参考资料,或者没有设置行的样式

编辑:

这是我的代码,它是一个龙格库塔微分方程求解器。我把你给我的那句话写在底部

    public MainWindow()
    {
        InitializeComponent();
    }

    ObservableCollection<KeyValuePair<double, double>> points = new ObservableCollection<KeyValuePair<double, double>>();

    private double function(double t, double y)
    {
        return y + t;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        points.Clear();
        points.Add(new KeyValuePair<double, double>(0, 1));
        double h = .01;

        for (int i = 0; i < 100; i++)
        {
            double k1 = function(points[i].Key, points[i].Value);
            double k2 = function(points[i].Key + (h / 2.0), points[i].Value + (h / 2.0) * k1);
            double k3 = function(points[i].Key + (h / 2.0), points[i].Value + (h / 2.0) * k2);
            double k4 = function(points[i].Key + h, points[i].Value + h * k3);
            double t = points[i].Key + h;
            double y = points[i].Value + (h / 6.0) * (k1 + 2 * k2 + 2 * k3 + k4);

            points.Add(new KeyValuePair<double, double>(t, y));
        }

        chart.DataContext = points;
    }
public主窗口()
{
初始化组件();
}
ObservableCollection points=新的ObservableCollection();
专用双功能(双t,双y)
{
返回y+t;
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
点。清除();
添加(新的KeyValuePair(0,1));
双h=.01;
对于(int i=0;i<100;i++)
{
双k1=函数(点[i]。键,点[i]。值);
双k2=函数(点[i]。键+(h/2.0),点[i]。值+(h/2.0)*k1);
双k3=函数(点[i]。键+(h/2.0),点[i]。值+(h/2.0)*k2);
双k4=函数(点[i]。键+h,点[i]。值+h*k3);
双t=点[i]。键+h;
双y=点[i]。值+(h/6.0)*(k1+2*k2+2*k3+k4);
添加(新的KeyValuePair(t,y));
}
chart.DataContext=点;
}
编辑(已解决):

我重构成了一个MVVM项目,现在它工作得很好。因此,寓意是,远离代码落后,即使是在很小的项目上。

这样做:

在您的
窗口中\u加载的
事件:

  chart.DataContext = points;
在您的XAML中:

<chartingToolkit:Chart x:Name="chart" Margin="0" Title="Chart Title">
    <chartingToolkit:LineSeries DependentValuePath="Value" IndependentValuePath="Key" ItemsSource="{Binding}" />
</chartingToolkit:Chart>

编辑:完整代码:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        Random r = new Random();
        ObservableCollection<KeyValuePair<double, double>> points = new ObservableCollection<KeyValuePair<double, double>>();

        for (int i = 0; i < 20; i++)
            points.Add(new KeyValuePair<double, double>(i, r.NextDouble()));

        chart1.DataContext = points;
    }
}
private void Window\u已加载(对象发送方,路由目标)
{
随机r=新随机();
ObservableCollection points=新的ObservableCollection();
对于(int i=0;i<20;i++)
添加(新的键值对(i,r.NextDouble());
图表1.DataContext=点;
}
}
这是使用您的点的图表:


很有趣。我将代码放在添加点的方法中,得到一个System.InvalidOperationException,其中说“此时无法修改此节点的逻辑子节点,因为正在进行树遍历”。几秒钟后,点加载,但x轴完全折叠,因此点放置在垂直线上。同时从XAML中取出
DataContext
。我这样做了,并在后面发布了C代码。为此,我将代码放在窗口中,查看我使用公式中的分数得到的结果。看起来不错。好的,这个项目肯定有进展,我想我会用MVVM框架,而不是代码隐藏,从头开始构建另一个项目,看看是否有效,谢谢。只是出于好奇。。。为什么在ObservableCollection中使用KeyValuePair。为什么不创建一个“System.Windows.Point”的可观察集合?您可以使用独立的:“x”和“y”作为从属项。通常我们在字典中使用KeyValuePair。但这是一个不可见的措辞。在您的情况下,只有在更改DataContext后从集合中添加/删除任何节点时,您才需要是可观察的。另外,你应该看看MVVM,我的经验告诉我这是必须的。是的,MVVM的建议是正确的,当我重构成MVVM时,图表填充得非常完美。感谢您提出使用Point的建议,因为我在别人告诉我“这是一个UI概念,您应该将它排除在视图模型之外”之前就已经使用了Point