C# windows wpf MVVC模式,如何在该模式中适应代码逻辑

C# windows wpf MVVC模式,如何在该模式中适应代码逻辑,c#,wpf,mvvm,C#,Wpf,Mvvm,我现在正在将现有的winform应用程序转换为WPF。我以前从未使用MVVC模式编写过任何代码,在我的具体案例中,我很难找出如何正确设置模型、视图模型和视图。 我要转换的应用程序用于使用串行端口与物理设备通信 让我们首先从现有的winform应用程序开始。几乎所有逻辑都在单独的.dll文件中,该文件公开了winform使用的接口。在显示数据时,实际上没有“代码隐藏”,因为dll已经公开了所需的所有内容。GUI中只有一些附加功能用于操作数据、保存当前数据等 问题是,我真的不明白如何在MVVM中很好


我现在正在将现有的winform应用程序转换为WPF。我以前从未使用MVVC模式编写过任何代码,在我的具体案例中,我很难找出如何正确设置模型、视图模型和视图。 我要转换的应用程序用于使用串行端口与物理设备通信

让我们首先从现有的winform应用程序开始。几乎所有逻辑都在单独的.dll文件中,该文件公开了winform使用的接口。在显示数据时,实际上没有“代码隐藏”,因为dll已经公开了所需的所有内容。GUI中只有一些附加功能用于操作数据、保存当前数据等

问题是,我真的不明白如何在MVVM中很好地适应这一点。据我所知,作为一个模型,我需要创建一些设备,这些设备将具有可更改和可读的所有属性。第一个问题,模型是否需要具体的类,或者它可能是某个接口(我已经有了),或者可能是抽象的设备类(实现这个接口)

关于ViewModels的第二个问题。我知道ViewModel以某种方式用于“粘合”要查看的模型数据。从这个角度来看,在ViewModel中,我可以把所有的代码作为格式化设备数据的结果,以一些好的格式输出,这些格式很容易被数据索引以供查看。但是,这里有一个怪癖。我认为我现在在该.dll文件中使用的这个接口非常适合在gui中进行数据索引(或者不适合)

另一个问题是关于观点本身。我知道视图不会意识到模型等,但我可以把我已经在WinFormGUI中的代码放在视图中吗?(用于将数据保存到csv文件、进行一些测量等)或者可能需要创建另一个模型(我不知道它可能是什么样子)

最后一个问题是在哪里放置使用串口的所有逻辑,用于所有功能的具体实现等等。我认为模型应该尽可能简单(如mvc模式),没有任何逻辑等等(但是,如果是这样的话,可能模型应该是唯一的接口?)。ViewModels应该只有数据操作代码,以友好的格式公开数据,以便查看并将其转换回模型。那么剩下的逻辑应该存在哪里呢?提前谢谢你们解释这件事。为了给我的帖子添加一些代码,下面是我在.dll文件中使用的接口

public interface IScope
{
    event EventHandler NewDataInBuffer;
    bool Destroy();
    bool Connect();
    bool Disconnect();
    bool StartCapture();
    bool StopCapture();
    string ScopeName { get; }
    IParameter<float> CurrentVoltageLimit { get; }
    IParameter<int> DataSamplesPerDiv { get; }

    List<IParameter<Config.Timebase>> AvailableTimebaseSettings { get; }
    List<IParameter<Config.Coupling>> AvailableCoupleSettings { get; }
    List<IParameter<Config.Slope>> AvailableTriggerSlopeSettings { get; }
    List<IParameter<Config.VerticalSensitivity>> AvailableSenitivitySettings { get; }
    List<IParameter<Config.TriggerMode>> AvailableTriggerModeSettings { get; }
    List<IParameter<Config.RecordLength>> AvailableRecordLength { get; }


    IParameter<Config.Timebase> TimeBase { get; set; }
    IParameter<Config.Coupling> Couple { get; set; }
    IParameter<Config.Slope> TriggerSlope { get; set; }
    IParameter<Config.VerticalSensitivity> Sensitivity { get; set; }
    IParameter<Config.TriggerMode> TriggerMode { get; set; }
    IParameter<Config.RecordLength> RecordLength { get; set; }
    int TriggerPosition { get; set; }
    float TriggerLevel { get; set; }
}


public interface IParameter<T>
{
    string ParameterName { get; }
    string ParameterValue { get; }
    string ParameterUnit { get; }
    bool IsReadOnly { get; }
    T GetParameter { get; }
}
公共接口IScope
{
事件处理程序NewDataInBuffer;
bool Destroy();
布尔连接();
bool Disconnect();
bool StartCapture();
bool-StopCapture();
字符串ScopeName{get;}
I参数CurrentVoltageLimit{get;}
i参数DataSamplesPerDiv{get;}
列出AvailableTimebaseSettings{get;}
列出可用的耦合设置{get;}
列出可用的TriggerSloweSettings{get;}
列出可用的初始化设置{get;}
列出可用的TriggerModeSettings{get;}
列表可用记录长度{get;}
i参数时基{get;set;}
i参数对{get;set;}
i参数触发器斜率{get;set;}
i参数灵敏度{get;set;}
I参数TriggerMode{get;set;}
i参数记录长度{get;set;}
int触发器位置{get;set;}
浮点触发器级别{get;set;}
}
公共接口参数
{
字符串参数名称{get;}
字符串参数值{get;}
字符串参数单位{get;}
bool是只读的{get;}
T GetParameter{get;}
}

了解MVVM是一段旅程。正如您看到的,它帮助您根据计划构建组件的原因。公平地说,这也可能是一种痛苦。Josh Smith花了100个小时在MVVM上写这篇文章,我从这里开始。Laurent Bugnon的MVVM灯也很有用。我通常使用View-ViewModel-Service层。在这种情况下,VM通过服务从存储/设备/c++库获取数据。。。提供这些数据(排序、修改、筛选等)以其所需的形式查看。服务方法是访问数据的一种好方法,当您需要从ViewModel打开文件时,它特别方便,服务可以处理这些数据,并且ViewModel不受视图特定DLL的限制。但有一件事要记住,一旦你完成了,它将是值得的。欢迎来到WPF世界。了解MVVM是一段旅程。正如您看到的,它帮助您根据计划构建组件的原因。公平地说,这也可能是一种痛苦。Josh Smith花了100个小时在MVVM上写这篇文章,我从这里开始。Laurent Bugnon的MVVM灯也很有用。我通常使用View-ViewModel-Service层。在这种情况下,VM通过服务从存储/设备/c++库获取数据。。。提供这些数据(排序、修改、筛选等)以其所需的形式查看。服务方法是访问数据的一种好方法,当您需要从ViewModel打开文件时,它特别方便,服务可以处理这些数据,并且ViewModel不受视图特定DLL的限制。但有一件事要记住,一旦你完成了,它将是值得的。欢迎来到WPF世界。