2017-04-23 4 views
0

SciChartコントロールのメソッドZoomBy()をViewModelから呼び出そうとしています。 ZoomBy()は、以下のようなファイルxaml.csで容易に入手可能である:ViewModelクラスのSciChartコントロールのZoomByメソッドを呼び出す

// TODO: Need to implement zoom using MVVM 
    private void BtnZoomIn_Click(object sender, RoutedEventArgs e) 
    { 
     TemperatureGraph.ChartModifier.XAxis.ZoomBy(-0.1, -0.1); 
    } 

私はViewModelにパターンを使用して実装する必要が同じ機能。

ただし、SciChartコントロールのViewportManagerを使用して、ZoomExtentsメソッドを簡単に呼び出すことができます。例えば。以下の下:XAMLファイル

<RocheButton Name="BtnZoomOut" DockPanel.Dock="Top" Icon="{IconResource Icon=ZoomOut}" HorizontalAlignment="Right" Command="{Binding ZoomOutCommand}" />  
<s:SciChartSurface x:Name="TemperatureGraph" Grid.Column="0" s:ThemeManager.Theme="BrightSpark" 
          RenderableSeries="{s:SeriesBinding TemperatureGraphViewModel}" DockPanel.Dock="Bottom" 
          ViewportManager="{Binding ViewportManager}"> 

とのViewModelコード:

public class TemperatureSummaryGraphViewModel : ViewModelBase 
    { 
     #region Private Members 

     private IXyDataSeries<TimeSpan, double> TemperatureDataSeries = new XyDataSeries<TimeSpan, double>(); 
     private IXyDataSeries<TimeSpan, double> AcquisitionPointDataSeries = new XyDataSeries<TimeSpan, double>(); 
     private DefaultViewportManager _viewportManager = new DefaultViewportManager(); 
     private ICommand _zoomOutCommand; 

     #endregion 

     #region Constructor 

     public TemperatureSummaryGraphViewModel() 
     { 
      ZoomOutCommand = new DelegateCommand(() => ZoomOutTemperatureGrpah()); 
      GenerateDummySeries(); 

      TemperatureGraphViewModel.Add(new LineRenderableSeriesViewModel() 
      { 
       DataSeries = TemperatureDataSeries, 
       StyleKey = "LineSeriesStyle0" 
      }); 

      TemperatureGraphViewModel.Add(new XyScatterRenderableSeriesViewModel() 
      { 
       DataSeries = AcquisitionPointDataSeries, 
       StyleKey = "ScatterSeriesStyle0" 
      }); 
     } 

     #endregion 

     #region Public Properties 

     public ObservableCollection<IRenderableSeriesViewModel> TemperatureGraphViewModel { get; } = new ObservableCollection<IRenderableSeriesViewModel>(); 

     public IViewportManager ViewportManager 
     { 
      get 
      { 
       return _viewportManager; 
      } 

      set 
      { 
       if (ReferenceEquals(value, _viewportManager)) 
       { 
        return; 
       } 

       _viewportManager = (DefaultViewportManager)value; 
       OnPropertyChanged("ViewportManager"); 
      } 
     } 

     public ICommand ZoomOutCommand 
     { 
      get 
      { 
       return _zoomOutCommand; 
      } 

      set 
      { 
       if (ReferenceEquals(value, _zoomOutCommand)) 
       { 
        return; 
       } 

       _zoomOutCommand = value; 
       OnPropertyChanged(nameof(ZoomOutCommand)); 
      } 
     } 

     #endregion 

     #region Public Methods 

     /// <summary> 
     /// To generate dummy data 
     /// // TODO: Need to integrate it with RunEditor with the actual data 
     /// </summary> 
     public void GenerateDummySeries() 
     { 
      double y = 80.5, yVar = 30.0; 

      TemperatureDataSeries.Append(TimeSpan.FromMinutes(1), 40.0); 
      TemperatureDataSeries.Append(TimeSpan.FromMinutes(2), 80.5); 
      for (int x = 2; x < 50; x++) 
      { 
       TemperatureDataSeries.Append(TimeSpan.FromMinutes(x), y); 

       yVar *= -1; 
       y += yVar; 
      } 

      for (var i = 5.4; i < 50; i += 2) 
      { 
       AcquisitionPointDataSeries.Append(TimeSpan.FromMinutes(i), 60.0); 
      } 
     } 

     public void ZoomOutTemperatureGrpah() 
     { 
      _viewportManager.ZoomExtents(); 
     } 

     #endregion 
    } 
} 

このコードは正常に動作していると100%にscichart制御をズームアウト。

私はZoomBy()を使って同じものを実装したいと思います。

+0

[もっと速い回答を得るために、どのような状況で「緊急」や他の類似のフレーズを追加することができますか?](https://meta.stackoverflow.com/q/326569) - 概要は次のとおりです。これはボランティアに対処する理想的な方法ではなく、おそらく回答を得ることには非生産的であるということです。これをあなたの質問に追加しないでください。 – halfer

+1

@halfer「緊急」なことを申し訳ありません。次回から気をつけます。編集が完了しました。 –

答えて

0

方法はZoomZoomByScrollScrollToのみIAxisAxisBase派生クラスに存在しているので、ViewModelにからこれらをトリガーする唯一の方法は、実際にあなたのViewModelに軸インスタンスを渡すことです。

これは真のMVVMではありませんが、回避策として考えられます:AxisをIAxisとしてViewModelに渡し、直接制御します。

唯一のもう1つの方法は、動作を書き込むことです。SciChart's favourite: a ChartModifierは、ViewModelからのイベントをリッスンし、軸を直接制御します。

これが推奨される方法です。 'Call method on View from ViewModel'を検索すると、ViewModelでイベントを発生させ、Viewで処理する方法がわかります。

関連する問題