2017-04-23 3 views
0

ViewModel에서 SciChart 컨트롤의 ZoomBy() 메서드를 호출하려고합니다.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); 
    } 

동일한 기능 내가 뷰 모델 패턴을 사용하여 구현해야 다음 xaml.cs 아래처럼 파일의 ZoomBy() 쉽게 사용할 수 있습니다.

그러나 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 
    } 
} 

이 코드는 잘 작동하고 100 %로 scichart 제어를 확대한다.

ZoomBy()을 사용하여 동일하게 구현하고 싶습니다. 방법 Zoom, ZoomBy, ScrollScrollTo 이후

+0

[더 빠른 답변을 얻기 위해 어떤 상황에서 "긴급한"또는 다른 유사한 문구를 추가 할 수 있습니까?] (https://meta.stackoverflow.com/q/326569) - 요약은 다음과 같습니다. 이것은 자원 봉사자를 대처하는 이상적인 방법이 아니며, 아마도 답을 얻는 데 비생산적입니다. 이 질문을 귀하의 질문에 추가하지 마십시오. – halfer

+1

@halfer '긴급한'일은 유감스럽게 생각합니다. 다음 번부터 돌봐 줄거야. 편집이 완료됩니다. –

답변

0

IAxisAxisBase 파생 클래스에 존재하는 뷰 모델에서 이러한 트리거 할 수있는 유일한 방법은 실제로 당신의 ViewModel에 축 인스턴스를 전달하는 것입니다.

이것은 MVVM이 아니지만 해결 방법으로 간주 될 수 있습니다. Axis를 IAxis로 ViewModel에 전달하고 직접 제어합니다.

유일한 다른 방법은 동작을 작성하거나 SciChart's favourite: a ChartModifier입니다.이 방법은 ViewModel의 이벤트를 수신하고 축을 직접 제어합니다.

이 방법이 가장 좋습니다. 'Call method on View from ViewModel'을 검색하면 ViewModel에서 이벤트를 발생시키고 View에서 처리하는 방식을 볼 수 있습니다.