使用 ObservableCollection 显示动态数据

Posted

技术标签:

【中文标题】使用 ObservableCollection 显示动态数据【英文标题】:Dynamic Data Display with ObservableCollection 【发布时间】:2016-11-21 08:20:40 【问题描述】:

我不知道如何使用 ObservableCollection 显示一些点。这是我的代码:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"
    Title="MainWindow" Height="350" Width="525">

<Grid>

    <d3:ChartPlotter x:Name="Plotter" Margin="100,5,0,0">
        <d3:LineGraph />
    </d3:ChartPlotter>

    <Button x:Name="button"
            Content="Load Graph"
            HorizontalAlignment="Left"
            Margin="10,35,0,0"
            VerticalAlignment="Top"
            Width="70"
            Height="45" Click="button_Click"/>

</Grid>

public partial class MainWindow : Window

    public ObservableCollection<Point> Data  get; set; 

    public MainWindow()
    
        InitializeComponent();

        Data = new ObservableCollection<Point>();
        Plotter.DataContext = this;
    

    private void button_Click(object sender, RoutedEventArgs e)
    
        double[] my_array = new double[10];

        for (int i = 0; i < my_array.Length; i++)
        
            my_array[i] = Math.Sin(i);
            Data.Add(new Point(i, my_array[i]));
        
    

谁能告诉我如何做到这一点?可能我必须在 XAML 中添加一些东西,比如 ItemsSource="Data" 但我找不到那个。 谢谢。

【问题讨论】:

您是否要将此添加到列表视图中? 是的,我想是的 :) 【参考方案1】:

使用Plotter.AddLineGraph(Data);

using Microsoft.Research.DynamicDataDisplay;
using Microsoft.Research.DynamicDataDisplay.DataSources;     

private void button_Click(object sender, RoutedEventArgs e)
            
                double[] my_array = new double[10];

                for (int i = 0; i < my_array.Length; i++)
                
                    my_array[i] = Math.Sin(i);
                    Data.Collection.Add(new Point(i, my_array[i]));
                
                Plotter.AddLineGraph(Data);
            

编辑:这是我使用 MVVM 的完整工作代码,因此您无需使用 AddLineGraph

XAML:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication1"
    xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
    <d3:ChartPlotter>
        <d3:LineGraph DataSource="Binding Data"></d3:LineGraph>
    </d3:ChartPlotter>
</Grid>

CS:

public partial class MainWindow : Window
    
        MyViewModel viewModel;

        public MainWindow()
        
            InitializeComponent();

            viewModel = new MyViewModel();
            DataContext = viewModel;
        

        private void Window_Loaded(object sender, RoutedEventArgs e)
        
            double[] my_array = new double[10];

            for (int i = 0; i < my_array.Length; i++)
            
                my_array[i] = Math.Sin(i);
                viewModel.Data.Collection.Add(new Point(i, my_array[i]));
            
        
    

视图模型:

using Microsoft.Research.DynamicDataDisplay.DataSources;

public class MyViewModel
    
        public ObservableDataSource<Point> Data  get; set; 

        public MyViewModel()
        
            Data = new ObservableDataSource<Point>();
        
    

【讨论】:

Data.Collection 不存在,在这个 NuGet 包中我有类似 Plotter.AddLineChart(object data) 的东西。你使用不同版本的 d3 吗? 我的版本是0.3.0.0 是的,有一个 v0.4.0。我已经从dynamicdatadisplay.codeplex.com 下载了您的版本,但我不知道如何处理这些文件夹(Sources、DynamicDadaDisplay、DDD.Coastline 等)。你能告诉我如何将它添加到我的项目中吗? 我所需要的只是在我的项目中添加对DynamicDataDisplay.dll 的引用以及正确的using,如上所示,就是这样......不知道为什么你会遇到麻烦.... 好的,有一个区别:我使用的是ObservableDataSource 而不是ObservableCollection【参考方案2】:

我不知道 XAML 中声明的命名空间:

xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"

但我可以添加一些建议。确保类 Point 将坐标值 X 和 Y 公开为公共属性。之后,您必须确保控件 ChartPlotter 支持 XAML 绑定。

【讨论】:

好吧,我用 WPF Toolkit 的图表做了这件事。我几乎可以肯定积分没问题。关于第二个:我在这里找到:mesta-automation.com/… 一些示例,但问题是并非每个命令都适用于我的 d3 版本(例如 plotter.AddLineGraph())。我的来自 NuGet 包。我也没有那么有经验,这就是我问的原因。 :)

以上是关于使用 ObservableCollection 显示动态数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 ObservableCollection 显示动态数据

WPF ObservableCollection 异步调用问题

在 ObservableCollection 上使用 Lambda 表达式

ObservableCollection 列表找不到方法 AddRange

使用 LINQ 从 ObservableCollection 源中删除元素 [重复]

将 ObservableCollection 保存到文件 (.txt)