我现在正在将现有的winform应用程序转换为WPF。之前我从未使用MVVC模式编写任何代码,而且我很难尝试弄清楚如何在我的特定情况下正确设置模型,视图模型和视图。
我要转换的应用程序用于使用串行端口与物理设备进行通信。
首先让我们从现有的winform应用程序开始。几乎所有逻辑都在单独的.dll文件中,该文件公开Winform消耗的接口。显示数据时确实没有“代码落后”,因为dll已经暴露了所需的一切。 GUI中只有一些其他功能可用于处理数据,保存当前数据等。
问题是我真的不明白如何将其很好地适合MVVM。据我了解,作为模型,我将需要创建一些设备,该设备具有可变且可读的所有属性。第一个问题是,模型是否需要是具体的类,或者可能是某个接口(我已经拥有)或抽象的设备类(实现此接口)?
关于ViewModels的第二个问题。我知道ViewModel以某种方式用于“粘合”模型数据进行查看。从ViewModel的角度来看,我可以将所有代码格式化为来自设备的数据,然后以易于使用的数据绑定到View的格式输出数据。但是,这是一个怪癖。我认为我现在在该.dll文件中使用的该界面非常适合在gui中进行数据绑定(或者可能不是?)。
另一个问题是关于View本身。我知道View不会知道模型等。但是我可以考虑一下winform GUI中已经拥有的代码吗? (用于将数据保存到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; }
}