2017-04-23 91 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上引发事件并在视图中处理的方法。

相关问题