C# 从ViewModel类调用SciChart控件的ZoomBy方法

C# 从ViewModel类调用SciChart控件的ZoomBy方法,c#,wpf,xaml,mvvm,scichart,C#,Wpf,Xaml,Mvvm,Scichart,我正在尝试从ViewModel调用SciChart控件的ZoomBy()方法。ZoomBy()在xaml.cs文件中很容易找到,如下所示: // 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控件的
ZoomBy()
方法。
ZoomBy()
在xaml.cs文件中很容易找到,如下所示:

 // 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
    }
}
public类TemperatureSummaryGraphViewModel:ViewModelBase
{
#区域私人成员
私有IXyDataSeries TemperatureDataSeries=新的XyDataSeries();
私有IXyDataSeries AcquisitionPointDataSeries=新的XyDataSeries();
私有DefaultViewportManager _viewportManager=新建DefaultViewportManager();
私有IComand(u zoomOutCommand);;
#端区
#区域构造函数
公共温度汇总图视图模型()
{
ZoomOutCommand=newdelegatecommand(()=>ZoomOutTemperatureGrpah());
GenerateDummySeries();
TemperatureGraphViewModel.Add(新的LineRenderableSeriesViewModel()
{
数据系列=温度数据系列,
StyleKey=“LineSeriesStyle0”
});
TemperatureGraphViewModel.Add(新的XyScatterRenderableSeriesViewModel()
{
DataSeries=AcquisitionPointDataSeries,
StyleKey=“ScatterSeriesStyle0”
});
}
#端区
#区域公共财产
public ObservableCollection TemperatureGraphViewModel{get;}=new ObservableCollection();
公共IViewportManager视口管理器
{
得到
{
return\u viewportManager;
}
设置
{
if(ReferenceEquals(值,_viewportManager))
{
返回;
}
_viewportManager=(DefaultViewportManager)值;
OnPropertyChanged(“ViewportManager”);
}
}
公共ICOMAND ZoomOutCommand
{
得到
{
返回zoomOutCommand;
}
设置
{
if(ReferenceEquals(值,_zoomOutCommand))
{
返回;
}
_zoomOutCommand=值;
OnPropertyChanged(名称(ZoomOutCommand));
}
}
#端区
#区域公共方法
/// 
///生成虚拟数据的步骤
/////TODO:需要将其与RunEditor与实际数据集成
/// 
public void GenerateDummySeries()
{
双y=80.5,yVar=30.0;
TemperatureDataSeries.Append(TimeSpan.FromMinutes(1),40.0);
TemperatureDataSeries.Append(TimeSpan.FromMinutes(2),80.5);
对于(int x=2;x<50;x++)
{
TemperatureDataSeries.Append(TimeSpan.FromMinutes(x),y);
yVar*=-1;
y+=yVar;
}
对于(变量i=5.4;i<50;i+=2)
{
AcquisitionPointDataSeries.Append(TimeSpan.FromMinutes(i),60.0);
}
}
公共空间ZoomOutTemperatureGrpah()
{
_viewportManager.ZoomExtents();
}
#端区
}
}
这段代码运行良好,并将scichart控件缩小到100%

我想使用
ZoomBy()

实现相同的方法,因为这些方法只存在于和派生类中,从ViewModel触发这些方法的唯一方法是将Axis实例实际传递到ViewModel中

这不是真正的MVVM,但可以认为是一种解决方法:将轴作为IAxis传递给ViewModel并直接控制它

唯一的其他方法是编写一个行为,或,它侦听来自ViewModel的事件并直接控制轴


这是首选方法。如果搜索“”,您将看到在ViewModel上引发事件并在视图中处理的方法

请阅读-总结是,这不是一个理想的方式来解决志愿者,可能会适得其反获得答案。请不要将此添加到您的问题中。@halfer对“紧急”事件表示抱歉。下一次我会小心的。编辑完成了。