首页 > 解决方案 > 如何使用类在 C# WPF 中减小 ViewModel 的大小

问题描述

继我上周发布的上一个问题之后,我有一个图表/图形应用程序,我的目标是从三个传感器读取数据并绘制它。

我将能够毫不费力地做到这一点,但以前我没有遵循 MVVM 原则,因为我是 WPF 的新手,并且在后面的代码中绝对拥有一切。现在我正在使用 MVVM 重写我的 Chart/Graph 应用程序。

我遇到的困难是尝试拆分 MainWindowViewModel 以处理其他类中的其他内容,以避免类冗长而复杂。

我有以下内容:

模型

public class MainWindowModel
{
    public ObservableCollection<SensorDataModel1> ocSensor1{ get; set; }
    public ObservableCollection<SensorDataModel2> ocSensor2{ get; set; }
    public ObservableCollection<SensorDataModel3> ocSensor3{ get; set; }
}

视图模型

public class MainWindowViewModel : ObservableObject
{

    public ObservableCollection<Sensor1DataModel> ocSensor1Data
    {
        get { return _model.ocSensor1; }
        set
        {
            _model.ocSensor1 = value;
            OnPropertyChanged("ocSensor1Data");
        }
    }

    private void SerialDataReceivedHandler(object sender, 
    SerialDataReceivedEventArgs e)
    {
        // parse all sensor data from Arduino to a list
        List<string> arduinoData = e.ToString().Split(',').ToList();

        // parses data here into 3 variables

        // sends to each sensors class (pseudocode to simplify example)
        sensor1Class.AddData(data1);
        sensor2Class.AddData(data2);
        sensor3Class.AddData(data3);
    }
}

传感器类示例

// Does some conversions to the data and then updates the ObservableCollection 
// in the MainWindowViewModel
public class Sensor1Class
{
        MainWindowViewModel main;
        public Sensor1Class()
        {
            main = new MainWindowViewModel();
        }

                public void AddData(List<string> data)
        {
            SensorDataModel1 model = new SensorDataModel1();

            // does some stuff to the data here

            // add parsed data to observable collection in viewmodel to be used by UI
            main.ocSensor1Data.Add(model);
        }
}

所以这里我有一个基本的 MVVM 架构,我有一个 Sensor1/2/3Class 来减少 MainWindowViewModel 中的一些工作,它需要对读入的数据进行一些转换。

理想情况下,我希望拥有自己的 Axis、Label、LineSeries、ChartZoom 等类,以便从 MainWindowViewModel 中提取大量代码。

示例:有一个Axis.cs类来保存特定于轴的数据

public class Axis
{
    // TODO - Axis class
    private double AxisMin;
    private double AxisMax;


    #region setters
    public void SetAxisLimits(double min, double max)
    {
        AxisMin = min;
        AxisMax = max;
    }

    public void SetAxisMin(double value)
    {
        AxisMin = value;
    }

    public void SetAxisMax(double value)
    {
        AxisMax = value;
    }
    #endregion

    #region getters
    public double GetAxisMin()
    {
        return AxisMin;
    }

    public double GetAxisMax()
    {
        return AxisMax;
    }

    #endregion
}

因此,不是所有这些都在 MainWindowViewModel 中,我可以在这里保存它,但是我是否需要为 Axis、LineSeries、Label 等创建一个单独的模型和 ViewModel 并将 DataContext 设置为每个单独的以获得类似的东西?

我基本上是在尝试将 MVVM 与更多 OO 原则结合起来,但是这样做可能完全违反了 MVVM。我想知道最好的方法是用很多类来构建我的应用程序并且仍然更新相同的视图。

标签: c#wpfmvvmdata-bindingviewmodel

解决方案


推荐阅读