2017-04-23 25 views
0

我想從ViewModel調用SciChart控件的ZoomBy()方法。該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); 
    } 

同樣的功能,我需要使用視圖模型模式來實現。

然而,使用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}"> 

而且視圖模型代碼:

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 
    } 
} 

此代碼工作正常,並縮小了scichart控制到100%。

我想使用ZoomBy()來實現相同的功能。

+0

請閱讀[在什麼情況下,我可以添加「緊急」或其他類似的短語到我的問題,以獲得更快的答案?](https://meta.stackoverflow.com/q/326569) - 摘要是這不是解決志願者問題的理想方式,而且可能對獲得答案起反作用。請不要將這添加到您的問題。 – halfer

+1

@halfer對不起'緊急'的事情。將在下次照顧。編輯完成。 –

回答

0

由於方法ZoomZoomByScrollScrollToIAxisAxisBase派生類的存在,從視圖模型觸發這些的唯一方法是實際的Axis實例傳遞到你的視圖模型。

這不是真正的MVVM,但它可以被認爲是一種解決方法:將您的Axis作爲IAxis傳遞給ViewModel並直接控制它。

唯一的另一種方法是編寫一個行爲或SciChart's favourite: a ChartModifier,它偵聽來自ViewModel的事件並直接控制軸。

這是首選的方法。如果您搜索'Call method on View from ViewModel',您將看到在ViewModel上引發事件並在視圖中處理的方法。