2016-03-22 133 views
1

私はプロットライブラリとしてbeto-rodriguezのMVVMパターンとライブチャートでWPFを使用していますが、リアルタイムのプロットUIを実装しようとしていますが、リアルタイムでグラフを更新します。私はリアルタイムでUIを更新するために複数のスレッドを実行しなければならないことを知っていますが、試したすべての方法がうまくいきません(今はC#を学んでいます)。 リアルタイム更新のためにこのパターンを正しく実装する方法と、プロットライブラリがそれを行うことができるかどうかは分かりません。MVVMでのリアルタイムUIとLiveChartsの更新

これは私の実際のコード(私は行いますし、任意のマルチスレッドコードを実装していません何のその簡易版)

のModelViewコードです:ここでは

using System; 
using System.ComponentModel; 
using System.Windows; 
using LiveCharts; 


    namespace TestMotionDetection 
    { 
     class MainViewModel : INotifyPropertyChanged 
     { 
      public SeriesCollection Series { get; set; } 

      public Func<double, string> YFormatter { get; set; } 
      public Func<double, string> XFormatter { get; set; } 

      public DataViewModel SData 
      { 
       set 
       { 
        Series[0].Values.Add(value); 
        OnPropertyChanged("Series"); 
       } 
      } 

      public event PropertyChangedEventHandler PropertyChanged; 

      public MainViewModel() 
      { 
       SeriesConfiguration<DataViewModel> config = new SeriesConfiguration<DataViewModel>(); 
       config.Y(model => model.Value); 
       config.X(model => model.Time); 

       Series = new SeriesCollection(config) 
       { 
        new LineSeries {Values = new ChartValues<DataViewModel>(), PointRadius = 0} 
       }; 

       XFormatter = val => Math.Round(val) + " ms"; 
       YFormatter = val => Math.Round(val) + " °"; 
      } 

      protected virtual void OnPropertyChanged(string propertyName) 
      { 
       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
      } 

      public void generateData() 
      { 
       DataViewModel val = new DataViewModel(); 
       for (int i = 0; i < 500; i++) 
       { 
        val.Time = i; 
        val.Value = i + 2.3f; 
        SData = val; 
       } 
      } 
     } 
    } 

ビューコードです:

using System.Windows; 


namespace TestMotionDetection 
{ 
    /// <summary> 
    /// Logica di interazione per MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private MainViewModel vista; 

     public MainWindow() 
     { 
      vista = new MainViewModel(); 
      DataContext = vista; 
     } 

     private void button_Click(object sender, RoutedEventArgs e) 
     { 
      vista.generateData(); 
     } 
    } 
} 

そしてXALM:

<Window x:Class="TestMotionDetection.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:lvc="clr-namespace:LiveCharts;assembly=LiveCharts" 
     Title="Example 2 (WPF)" 
     Width="1025.213" 
     Height="482.801"> 

    <Grid> 
     <lvc:LineChart Margin="0,2,245,-2" 
         LegendLocation="Right" 
         Series="{Binding Series}"> 
      <lvc:LineChart.AxisX> 
       <lvc:Axis LabelFormatter="{Binding XFormatter}" Separator="{x:Static lvc:DefaultAxes.CleanSeparator}" /> 
      </lvc:LineChart.AxisX> 
      <lvc:LineChart.AxisY> 
       <lvc:Axis LabelFormatter="{Binding YFormatter}" /> 
      </lvc:LineChart.AxisY> 
     </lvc:LineChart> 
     <Button x:Name="button" 
       Width="151" 
       Height="79" 
       Margin="804,47,0,0" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Top" 
       Click="button_Click" 
       Content="Button" /> 
    </Grid> 
</Window> 

[UPDATE 1] [enter image description here] 1

+0

ライブチャートの動作にマルチスレッドは必要ありません。gitbugリポジトリに報告する問題コンシューサーがいる場合は、どうかしてください。https://github.com/beto-rodriguez/Live-Charts –

答えて

1

あなたXFormatter & YFormatterは両方このようにする必要があります:あなたがC#6を使用している場合は、代わりにnameof(YFormatter)を行う必要があります

private Func<double, string> _yFormatter; 
public Func<double, string> YFormatter { 
    get{ return _yFormatter; } 
    set 
    { 
     _yFormatter = value; 
     OnPropertyChanged("YFormatter"); 
    } 

ビューが更新されます。そうしないと、ビューにはフォーマッタが変更されたことがわからなくなります。

+0

問題はありません私の "メイン"実装では、フォーマッタ値を変更せずに、データのストリームが終了した後にプロットが2番目に更新されます。シリーズに新しいデータだけを挿入します。 –

+0

フォーマッタが変更されない場合は、ここに配置していないコードの一部のライブチャートに関連している可能性があります。 MVVMの観点から見れば他のすべてがうまく見えます。ライブ・グラフをあなたのタグに追加したり、フォーラムにこの質問を投稿することをお勧めします。 –

+0

...または、アイテムに系列を追加するたびに 'OnPropertyChanged(" YFormatter ");を呼び出す必要があります。 –

関連する問題