0

MainWindowクラスで指定されたリアルタイムチャートを表示するクラスがありますDataChart。アプリを実行すると、DataChartクラスのコンストラクターで新しいスレッドを開始するため、チャートは新しいデータの追加と更新を開始します。MainWindowしかし、アプリの起動後ではなく、クラスで定義されたボタンをクリックした後にチャートの更新を開始する必要があります。しかし、同じ Thred を から開始するとMainWindow、チャートは更新されず、PropertyChangedEventHandlernull になります。

MainWindow

private void connectBtn_Click(object sender, RoutedEventArgs e)
        {
            DataChart chart = new DataChart();
            Thread thread = new Thread(chart.AddPoints);
            thread.Start();
        }

DataChart

public class DataChart : INotifyPropertyChanged
    {
        public DataChart()
        {
            DataPlot = new PlotModel();

            DataPlot.Series.Add(new LineSeries
            {
                Title = "1",
                Points = new List<IDataPoint>()
            });
            m_userInterfaceDispatcher = Dispatcher.CurrentDispatcher;
            //WHEN I START THREAD HERE IT WORKS AND PROPERTYCHANGED IS NOT NULL
            //var thread = new Thread(AddPoints);
            //thread.Start();                     
        }

        public void AddPoints()
        {
            var addPoints = true;
            while (addPoints)
            {
                try
                {
                    m_userInterfaceDispatcher.Invoke(() =>
                    {
                        (DataPlot.Series[0] as LineSeries).Points.Add(new DataPoint(xvalue,yvalue));
                        if (PropertyChanged != null) //=NULL WHEN CALLING FROM MainWindow
                        {
                            DataPlot.InvalidatePlot(true);
                        }
                    });
                }
                catch (TaskCanceledException)
                {
                    addPoints = false;
                }
            }
        }
        public PlotModel DataPlot
        {
            get;
            set;
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private Dispatcher m_userInterfaceDispatcher;
    }

チャートが更新されない問題はそれだと思いますが、PropertyChanged=null解決方法がわかりません。OxyPlot役に立ったら使っています。

MainWindow.xaml:

<oxy:Plot Model="{Binding DataPlot}" Margin="10,10,10,10" Grid.Row="1" Grid.Column="1"/>
4

1 に答える 1

0

あなたの問題はDataChart、ローカル変数としての新しいインスタンスを作成していることです。データバインディングがそのイベントをどのようにサブスクライブしたと思いますか?

DataBinding は、 として設定されたインスタンスのイベントをサブスクライブするため、同じインスタンスでDataContext呼び出す必要があります。AddPoints次のことを試してください。

private void connectBtn_Click(object sender, RoutedEventArgs e)
{
    DataChart chart = (DataChart)this.DataContext;
    Thread thread = new Thread(chart.AddPoints);
    thread.Start();
}
于 2014-04-17T18:46:54.037 に答える