代码之家  ›  专栏  ›  技术社区  ›  knockando

WPF图表系列动态数据绑定

  •  2
  • knockando  · 技术社区  · 14 年前

    如何将图表系列绑定到数据更改的数据源?我当然需要图表系列来反映基础数据的变化。我需要一个新的角度。

    1 回复  |  直到 14 年前
        1
  •  6
  •   vortexwolf    14 年前

    我想你指的是WPF工具箱里的图表。对添加/删除事件使用ObservableCollection,对更新事件使用INotifyPropertyChanged。

    Xaml编号:

    <chart:Chart>
        <chart:Chart.Series>
            <chart:LineSeries DependentValuePath="Value" IndependentValuePath="Time"
                    Title="Example" x:Name="lineChart">
                <chart:LineSeries.DependentRangeAxis>
                    <chart:LinearAxis Orientation="Y" Minimum="0" Maximum="20" />
                </chart:LineSeries.DependentRangeAxis>
            </chart:LineSeries>
        </chart:Chart.Series>
    </chart:Chart>
    

    代码隐藏:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
    
            var r = new Random();
            var Items = new ObservableCollection<ChartItem>(
                Enumerable.Range(0,5).Select(i=>new ChartItem(i,1)).ToList());
            var t = new System.Timers.Timer { Interval = 1000 };
            var start = DateTime.Now;
            //occurs every 1 second
            t.Elapsed += (s, e) => Dispatcher.Invoke((Action)(() =>
                                {
                                    Items[r.Next(0, Items.Count)].Value = r.Next(20);
                                    Items.Add(new ChartItem((e.SignalTime - start).TotalSeconds, r.Next(20)));
                                }));
            t.Start();
            lineChart.ItemsSource = Items;
        }
    }
    

    public class ChartItem:INotifyPropertyChanged
    {
        public ChartItem(double t, double v)
        {
            time = t;
            myVar = v;
        }
    
        private double time;
    
        public double Time
        {
            get { return time; }
            set
            {
                time = value;
                OnPropertyChanged("Time");
            }
        }
    
        private double myVar;
    
        public double Value
        {
            get { return myVar; }
            set
            {
                myVar = value;
                OnPropertyChanged("Value");
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

    此外,动态图表: http://dynamicdatadisplay.codeplex.com/