using Common; using Common.DevicesModels; using Common.Models; using CommunityToolkit.Mvvm.Input; using MegaRobo.C00225155.DataAccess; using MegaRobo.Contract; using MegaRobo.Entities; using MegaRobo.WpfInfrastructure.Abstractions; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace MegaRobo.C00225155App.MenuViewModels { public class SuckFluidViewModel : ViewModelBaseEx { public List> SuckModeItems { get; set; } public List> DrainageModeItems { get; set; } private SuckMode selectedsuckmode; /// /// 选择的吸液模式 /// public SuckMode SelectedSuckMode { get => selectedsuckmode; set { if (SetProperty(ref selectedsuckmode, value)) { UpdateSuckFluidPropByMode(value); } } } private DrainageMode selecteddrainagemode; /// /// 选择的排液模式 /// public DrainageMode SelectedDrainageMode { get => selecteddrainagemode; set { if (SetProperty(ref selecteddrainagemode, value)) { UpdateDrainagePropByMode(value); } } } private object suckfluidprop; public object SuckFluidProp { get => suckfluidprop; set { if (SetProperty(ref suckfluidprop, value)) { ParseProperties(); } } } private object drainageprop; public object DrainageProp { get => drainageprop; set { if (SetProperty(ref drainageprop, value)) { ParseDrainageProperties(); } } } private double ratio; public double Ratio { get { return ratio; } set { ratio = value; } } private string liquidname; public string LiquidName { get => liquidname; set => SetProperty(ref liquidname, value); } private ObservableCollection _properties = new ObservableCollection(); public ObservableCollection Properties { get => _properties; set => SetProperty(ref _properties, value); } private ObservableCollection _drainageproperties = new ObservableCollection(); public ObservableCollection DrainageProperties { get => _drainageproperties; set => SetProperty(ref _drainageproperties, value); } public override void Initialize(ICoreService coreService, string title, params object[] args) { base.Initialize(coreService, title, args); } protected override void LoadServices() { base.LoadServices(); } protected override void LoadDatas() { base.LoadDatas(); } protected override void Register() { base.Register(); } public SuckFluidViewModel() { SuckModeItems = EnumHelperr.GetEnumDescriptionList(); DrainageModeItems = EnumHelperr.GetEnumDescriptionList(); } /// /// 根据选中的吸液模式,更新吸液参数配置实例 /// /// 选中的吸液模式 private void UpdateSuckFluidPropByMode(SuckMode mode) { // 保存当前模式的参数(如果已有配置,用于保留可复用的参数值) var currentValues = SuckFluidProp != null ? GetCurrentPropertyValues(SuckFluidProp) : null; // 根据新模式创建对应的参数配置实例(如 MA→SuckFluidByMA) SuckFluidProp = mode switch { SuckMode.MA => new SuckFluidByMA(), SuckMode.ME => new SuckFluidByME(), SuckMode.MG => new SuckFluidByMG(), _ => new SuckFluidByMA() // 默认值 }; // 如果有旧参数,尝试将可复用的值同步到新实例(可选逻辑) if (currentValues != null) { SyncPropertyValues(SuckFluidProp, currentValues); } // 重新解析参数列表,更新界面显示 ParseProperties(); } private void ParseProperties() { Properties.Clear(); // 清空现有内容 if (SuckFluidProp == null) return; // 反射获取 SuckFluidProp(实际是 MA/ME/MG 实例)的所有公共属性 var props = SuckFluidProp.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var prop in props) { // 跳过不需要编辑的属性(如 CmdCode) if (prop.Name == "CmdCode") continue; // 获取 [Numeric] 特性 var numericAttr = prop.GetCustomAttribute(); // 添加到 Properties 集合(供界面显示) Properties.Add(new PropertyItem { Name = prop.Name, Description = numericAttr?.Descr ?? "无描述", Value = prop.GetValue(SuckFluidProp), // 初始值 Type = prop.PropertyType, NumericAttribute = numericAttr, TargetObject = SuckFluidProp, PropertyInfo = prop }); } } /// /// 根据选中的分液模式,更新分液参数配置实例 /// /// 选中的分液模式 private void UpdateDrainagePropByMode(DrainageMode mode) { // 保存当前模式的参数(如果已有配置) var currentValues = DrainageProp != null ? GetCurrentPropertyValues(DrainageProp) : null; // 根据新模式创建对应的参数配置实例(如 ML→DrainageFluidByML) DrainageProp = mode switch { DrainageMode.ML => new DrainageFluidByML(), DrainageMode.MH => new DrainageFluidByMH(), _ => new DrainageFluidByML() // 默认值 }; // 同步可复用的旧参数到新实例(可选逻辑) if (currentValues != null) { SyncPropertyValues(DrainageProp, currentValues); } // 重新解析参数列表,更新界面显示 ParseDrainageProperties(); } private void ParseDrainageProperties() { DrainageProperties.Clear(); // 清空现有内容 if (DrainageProp == null) return; // 反射获取 SuckFluidProp(实际是 MA/ME/MG 实例)的所有公共属性 var props = DrainageProp.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var prop in props) { // 跳过不需要编辑的属性(如 CmdCode) if (prop.Name == "CmdCode") continue; // 获取 [Numeric] 特性 var numericAttr = prop.GetCustomAttribute(); // 添加到 Properties 集合(供界面显示) DrainageProperties.Add(new PropertyItem { Name = prop.Name, Description = numericAttr?.Descr ?? "无描述", Value = prop.GetValue(DrainageProp), // 初始值 Type = prop.PropertyType, NumericAttribute = numericAttr, TargetObject = DrainageProp, PropertyInfo = prop }); } } /// /// 获取当前参数实例的所有属性值(用于模式切换时暂存) /// private Dictionary GetCurrentPropertyValues(object obj) { if (obj == null) return null; var values = new Dictionary(); var props = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var prop in props) { // 只保存需要复用的属性(排除 CmdCode 等模式专属字段) if (prop.Name != "CmdCode") { values[prop.Name] = prop.GetValue(obj); } } return values; } /// /// 将旧参数值同步到新实例(仅同步名称和类型匹配的属性) /// private void SyncPropertyValues(object newObj, Dictionary oldValues) { if (newObj == null || oldValues == null) return; var newProps = newObj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var prop in newProps) { // 只同步名称存在于旧参数且类型匹配的属性 if (oldValues.TryGetValue(prop.Name, out var oldValue) && prop.PropertyType.IsAssignableFrom(oldValue.GetType())) { prop.SetValue(newObj, oldValue); } } } } }