| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891 | using Aitex.Core.RT.Log;using Caliburn.Micro.Core;using MECF.Framework.Common.DataCenter;using MECF.Framework.Common.ParameterCenter;using MECF.Framework.Common.RecipeCenter;using MECF.Framework.UI.Client.CenterViews.Configs.SystemConfig;using RecipeEditorLib.DGExtension.CustomColumn;using RecipeEditorLib.RecipeModel.Params;using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Xml;namespace MECF.Framework.UI.Client.CenterViews.Parameter{    public class ParameterDataBase : PropertyChangedBase    {        public bool IsChanged        {            get            {                bool changed = !IsSavedDesc;                if (!changed)                {                    //changed = ChkChanged(Steps) || ChkChanged(PopSettingSteps) || ChkChanged(StepTolerances);                }                if (!changed)                {                    foreach (Param config in this.ConfigItems)                    {                        if (!config.IsSaved)                        {                            changed = true;                            break;                        }                    }                }                return changed;            }        }        private bool _isSavedDesc;        public bool IsSavedDesc        {            get { return _isSavedDesc; }            set            {                this._isSavedDesc = value;                this.NotifyOfPropertyChange("IsSavedDesc");            }        }        private string name;        public string Name        {            get { return this.name; }            set            {                this.name = value;                this.NotifyOfPropertyChange("Name");            }        }        private string _chamberType;        public string ChamberType        {            get { return this._chamberType; }            set            {                this._chamberType = value;                this.NotifyOfPropertyChange("ChamberType");            }        }        private string _version;        public string Version        {            get { return this._version; }            set            {                this._version = value;                this.NotifyOfPropertyChange("Version");            }        }        private int _tableNumber;        public int TableNumber        {            get { return this._tableNumber; }            set            {                this._tableNumber = value;                this.NotifyOfPropertyChange("TableNumber");            }        }        private string _permission;        public string Permission        {            get { return this._permission; }            set            {                this._permission = value;                this.NotifyOfPropertyChange("Permission");            }        }        private string _level;        public string Level        {            get { return this._level; }            set            {                this._level = value;                this.NotifyOfPropertyChange("Level");            }        }        private string _prefixPath;        public string PrefixPath        {            get { return _prefixPath; }            set            {                _prefixPath = value;                this.NotifyOfPropertyChange("PrefixPath");            }        }        private string creator;        public string Creator        {            get { return this.creator; }            set            {                this.creator = value;                this.NotifyOfPropertyChange("Creator");            }        }        private DateTime createTime;        public DateTime CreateTime        {            get { return this.createTime; }            set            {                this.createTime = value;                this.NotifyOfPropertyChange("CreateTime");            }        }        private string description;        public string Description        {            get { return this.description; }            set            {                this.description = value;                this.NotifyOfPropertyChange("Description");            }        }        private string devisor;        public string Revisor        {            get { return this.devisor; }            set            {                this.devisor = value;                this.NotifyOfPropertyChange("Revisor");            }        }        private DateTime deviseTime;        public DateTime ReviseTime        {            get { return this.deviseTime; }            set            {                this.deviseTime = value;                this.NotifyOfPropertyChange("ReviseTime");            }        }        public ObservableCollection<ParameterTable> Steps { get; private set; }        public Dictionary<string, ObservableCollection<ObservableCollection<Param>>> PopSettingSteps { get; private set; }        public ObservableCollection<ObservableCollection<Param>> StepTolerances { get; private set; }        public ObservableCollection<Param> ConfigItems { get; private set; }        public List<int> StepNos = new List<int>();        protected XmlDocument _doc;        protected string _module;        public bool ToleranceEnable { get; set; }        public Dictionary<string, bool> PopEnable { get; set; }        public bool IsCompatibleWithCurrentFormat { get; set; }        public bool ChkChanged(Dictionary<string, ObservableCollection<ObservableCollection<Param>>> PopSteps)        {            return false;        }        public void CloneStep(ref ParameterTable destinationStep, ParameterTable originalStep)        {            //destinationStep.StepNo = originalStep.StepNo;            destinationStep.Name = originalStep.Name;         //   destinationStep.UseTemp = originalStep.UseTemp;        }        public void CloneStep(ParameterTable destinationStep, ParameterTable originalStep)        {            //destinationStep.StepNo = originalStep.StepNo;            destinationStep.Name = originalStep.Name;          //  destinationStep.UseTemp = originalStep.UseTemp;        }        public ParameterDataBase()        {            this.Steps = new ObservableCollection<ParameterTable>();            StepTolerances = new ObservableCollection<ObservableCollection<Param>>();            this.PopSettingSteps = new Dictionary<string, ObservableCollection<ObservableCollection<Param>>>();            this.PopEnable = new Dictionary<string, bool>();            ConfigItems = new ObservableCollection<Param>();            IsSavedDesc = true;            _doc = new XmlDocument();            XmlElement node = _doc.CreateElement("Aitex");            _doc.AppendChild(node);            node.AppendChild(_doc.CreateElement("TableParameterData"));        }        public void Clear()        {            Steps.Clear();            PopSettingSteps.Clear();            StepTolerances.Clear();            ConfigItems.Clear();            ChamberType = "";            Version = "";            IsSavedDesc = true;            _module = "";        }        public void DataSaved()        {            //foreach (Step parameters in Steps)            //{            //    parameters.Apply(param => param.IsSaved = true);            //}            //foreach (ObservableCollection<ObservableCollection<Param>> popParameters in PopSettingSteps.Values)            //{            //    foreach (ObservableCollection<Param> parameters in popParameters)            //    {            //        parameters.Apply(param => param.IsSaved = true);            //    }            //}            //foreach (ObservableCollection<Param> parameters in StepTolerances)            //{            //    parameters.Apply(param => param.IsSaved = true);            //}            //ConfigItems.Apply(config => config.IsSaved = true);            //IsSavedDesc = true;        }        public virtual void InitData(string prefixPath, string recipeName, string recipeContent, string module)        {            IsCompatibleWithCurrentFormat = false;            _module = module;            Name = recipeName;            PrefixPath = prefixPath;            try            {                _doc = new XmlDocument();                _doc.LoadXml(recipeContent);                if (!LoadHeader(_doc.SelectSingleNode("Aitex/TableParameterData")))                    return;                XmlNodeList nodeSteps = _doc.SelectNodes($"Aitex/TableParameterData/Module[@Name='{module}']/Step");                if (nodeSteps == null)                    nodeSteps = _doc.SelectNodes($"Aitex/TableParameterData/Step");                LoadSteps(nodeSteps);                var index = 1;                foreach (ParameterTable parameters in Steps)                {                    parameters.Value = index.ToString();                    index++;                }                //   ValidLoopData();                XmlNode nodeConfig =                    _doc.SelectSingleNode($"Aitex/TableParameterData/Module[@Name='{module}']/Config");                if (nodeSteps == null)                    nodeConfig = _doc.SelectSingleNode($"Aitex/TableParameterData/Config");                //   LoadConfigs(configDefine, nodeConfig);                IsCompatibleWithCurrentFormat = true;            }            catch (Exception ex)            {                LOG.Write(ex);            }        }        public void ChangeChamber(ObservableCollection<EditorDataGridTemplateColumnBase> columnDefine, Dictionary<string, ObservableCollection<Param>> PopSettingColumns            , ObservableCollection<Param> configDefine, string module)        {            _module = module;            try            {                XmlNodeList nodeSteps = _doc.SelectNodes($"Aitex/TableParameterData/Module[@Name='{module}']/Step");                if (nodeSteps == null)                    nodeSteps = _doc.SelectNodes($"Aitex/TableParameterData/Step");                LoadSteps(nodeSteps);                XmlNode nodeConfig =                    _doc.SelectSingleNode($"Aitex/TableParameterData/Module[@Name='{module}']/Config");                if (nodeSteps == null)                    nodeConfig = _doc.SelectSingleNode($"Aitex/TableParameterData/Config");                LoadConfigs(configDefine, nodeConfig);            }            catch (Exception ex)            {                LOG.Write(ex);            }        }        public void SaveTo(string[] moduleList)        {            GetXmlString();            XmlNode nodeModule = _doc.SelectSingleNode($"Aitex/TableParameterData/Module[@Name='{_module}']");            if (nodeModule == null)            {                LOG.Write("Parameter not find modules," + Name);                return;            }            XmlNode nodeData = nodeModule.ParentNode;            foreach (var module in moduleList)            {                if (module == _module)                {                    continue;                }                var child = _doc.SelectSingleNode($"Aitex/TableParameterData/Module[@Name='{module}']");                if (child != null)                    nodeData.RemoveChild(child);                XmlElement node = nodeModule.Clone() as XmlElement;                node.SetAttribute("Name", module);                nodeData.AppendChild(node);            }        }       protected int StepNo = 1;        public Dictionary<string, string> StepTimeToDictionary(string stepTime)        {            Dictionary<string, string> steptimes = new Dictionary<string, string>();            string[] tempTimes = stepTime.Split(';');            foreach (var item in tempTimes)            {                string[] subTimes = item.Split(',');                steptimes.Add(subTimes[0], subTimes[1]);            }            return steptimes;        }        public virtual ParameterTable CreateStep(XmlNode stepNode = null)        {            ParameterTable step = new ParameterTable();            if (stepNode != null)            {                if (stepNode.Attributes["StepNo"] != null)                    step.StepNo = int.Parse(stepNode.Attributes["StepNo"].Value);                if (stepNode.Attributes["Name"] != null)                    step.Name = stepNode.Attributes["Name"].Value;                //if (stepNode.Attributes["UseTemp"] != null)                //    step.UseTemp = stepNode.Attributes["UseTemp"].Value;            }            else            {                step.StepNo = StepNo;                step.Name = "Name" + StepNo.ToString();               // step.UseTemp = "0";                StepNo++;            }            return step;        }        protected bool LoadHeader(XmlNode nodeHeader)        {            if (nodeHeader == null)                return false;            if (nodeHeader.Attributes["CreatedBy"] != null)                this.Creator = nodeHeader.Attributes["CreatedBy"].Value;            if (nodeHeader.Attributes["CreationTime"] != null)                this.CreateTime = DateTime.Parse(nodeHeader.Attributes["CreationTime"].Value);            if (nodeHeader.Attributes["LastRevisedBy"] != null)                this.Revisor = nodeHeader.Attributes["LastRevisedBy"].Value;            if (nodeHeader.Attributes["LastRevisionTime"] != null)                this.ReviseTime = DateTime.Parse(nodeHeader.Attributes["LastRevisionTime"].Value);            if (nodeHeader.Attributes["Description"] != null)                this.Description = nodeHeader.Attributes["Description"].Value;            string chamberType = string.Empty;            if (nodeHeader.Attributes["ChamberType"] != null)                chamberType = nodeHeader.Attributes["ChamberType"].Value;            if (!string.IsNullOrEmpty(chamberType) && chamberType != ChamberType)            {                LOG.Write($"{chamberType} is not accordance with {ChamberType}");                return false;            }            if (nodeHeader.Attributes["Version"] != null)                Version = nodeHeader.Attributes["Version"].Value;            if (nodeHeader.Attributes["TableNumber"] != null)                TableNumber = Convert.ToInt32(nodeHeader.Attributes["TableNumber"].Value);            if (nodeHeader.Attributes["Permission"] != null)                this.Permission = nodeHeader.Attributes["Permission"].Value;            LoadHeaderExtend(nodeHeader);            return true;        }        public virtual void LoadHeaderExtend(XmlNode nodeHeader)        {                 }        public virtual void LoadSteps(XmlNodeList steps)        {            Steps.Clear();            PopSettingSteps.Clear();            StepTolerances.Clear();            StepNos.Clear();            int index = 1;            foreach (XmlNode nodeStep in steps)            {                ParameterTable step = this.CreateStep(nodeStep);                StepNos.Add(step.StepNo);                //(rows[1] as StepParam).Value = index.ToString();                //CreateStepTolerance(columns, popSettingColumns, nodeStep, out ObservableCollection<Param> step, out ObservableCollection<Param> warning,                //    out ObservableCollection<Param> alarm, out Dictionary<string, ObservableCollection<Param>> popSettingStep                //    );                //StepTolerances.Add(step);                //(step[1] as DoubleParam).Value = index.ToString();                //StepTolerances.Add(warning);                //(warning[1] as DoubleParam).Value = "Warn(%)";                //StepTolerances.Add(alarm);                //(alarm[1] as DoubleParam).Value = "Alarm(%)";                Steps.Add(step);                //foreach (string key in popSettingStep.Keys)                //{                //    if (!PopSettingSteps.ContainsKey(key))                //    {                //        PopSettingSteps.Add(key, new ObservableCollection<ObservableCollection<Param>>());                //    }                //    PopSettingSteps[key].Add(popSettingStep[key]);                //}                index++;            }            if (StepNos == null || StepNos.Count == 0)            {                StepNo = 1;            }            else            {                StepNo = StepNos.Max() + 1;            }        }        private void LoadConfigs(ObservableCollection<Param> configDefine, XmlNode configNode)        {            ConfigItems.Clear();            foreach (var param in configDefine)            {                if (param is DoubleParam param1)                {                    var config = new DoubleParam()                    {                        Name = param.Name,                        Value = param1.Value,                        DisplayName = param.DisplayName,                        Minimun = param1.Minimun,                        Maximun = param1.Maximun,                        Resolution = param1.Resolution                    };                    if (configNode != null && configNode.Attributes[param1.Name] != null)                        config.Value = configNode.Attributes[param1.Name].Value;                    ConfigItems.Add(config);                }                if (param is StringParam paramString)                {                    var config = new StringParam()                    {                        Name = param.Name,                        Value = paramString.Value,                        DisplayName = param.DisplayName,                    };                    if (configNode != null && configNode.Attributes[paramString.Name] != null)                        config.Value = configNode.Attributes[paramString.Name].Value;                    ConfigItems.Add(config);                }            }        }        //public ObservableCollection<Param> CloneStep(ObservableCollection<EditorDataGridTemplateColumnBase> _columns, ObservableCollection<Param> _sourceParams)        //{        //    ObservableCollection<Param> targetParams = this.CreateStep(_columns);        //    for (var index = 0; index < _sourceParams.Count; index++)        //    {        //        if (_sourceParams[index] is StringParam)        //        {        //            ((StringParam)targetParams[index]).Value = ((StringParam)_sourceParams[index]).Value;        //        }        //        else if (_sourceParams[index] is IntParam)        //        {        //            ((IntParam)targetParams[index]).Value = ((IntParam)_sourceParams[index]).Value;        //        }        //        else if (_sourceParams[index] is ComboxParam)        //        {        //            ((ComboxParam)targetParams[index]).Value = ((ComboxParam)_sourceParams[index]).Value;        //        }        //        else if (_sourceParams[index] is LoopComboxParam)        //        {        //            ((LoopComboxParam)targetParams[index]).Value = ((LoopComboxParam)_sourceParams[index]).Value;        //        }        //        else if (_sourceParams[index] is BoolParam)        //        {        //            ((BoolParam)targetParams[index]).Value = ((BoolParam)_sourceParams[index]).Value;        //        }        //        else if (_sourceParams[index] is IntParam)        //        {        //            ((IntParam)targetParams[index]).Value = ((IntParam)_sourceParams[index]).Value;        //        }        //        else if (_sourceParams[index] is DoubleParam)        //        {        //            ((DoubleParam)targetParams[index]).Value = ((DoubleParam)_sourceParams[index]).Value;        //        }        //        targetParams[index].Parent = targetParams;        //    }        //    return targetParams;        //}        private string GetConditionCheckXmlString(ParameterTable parameters)        {            StringBuilder conditionCheckStr = new StringBuilder();            string externalSensor = "";            conditionCheckStr.Append($"{externalSensor};");            //conditionCheckStr.Append($"TempUpper:{parameters.TempUpper.ToString()};");            //conditionCheckStr.Append($"TempLower:{parameters.TempLower.ToString()};");            return conditionCheckStr.ToString();        }        public virtual string GetXmlString()        {            XmlElement nodeData = _doc.SelectSingleNode($"Aitex/TableParameterData") as XmlElement;            nodeData.SetAttribute("CreatedBy", Creator);            nodeData.SetAttribute("CreationTime", CreateTime.ToString("yyyy-MM-dd HH:mm:ss"));            nodeData.SetAttribute("LastRevisedBy", Revisor);            nodeData.SetAttribute("LastRevisionTime", ReviseTime.ToString("yyyy-MM-dd HH:mm:ss"));            nodeData.SetAttribute("Description", Description);            nodeData.SetAttribute("ParameterChamberType", ChamberType);            nodeData.SetAttribute("Version", Version);            nodeData.SetAttribute("TableNumber", TableNumber.ToString());            nodeData.SetAttribute("Permission", Permission);            nodeData.SetAttribute("ParameterLevel", Level);            XmlNode nodeModule = _doc.SelectSingleNode($"Aitex/TableParameterData/Module[@Name='{_module}']");            if (nodeModule == null)            {                nodeModule = _doc.CreateElement("Module");                nodeData.AppendChild(nodeModule);            }            nodeModule.RemoveAll();            (nodeModule as XmlElement).SetAttribute("Name", _module);            int i = 0;            foreach (ParameterTable parameters in Steps)            {                XmlElement nodeWarning = _doc.CreateElement("Warning");                XmlElement nodeAlarm = _doc.CreateElement("Alarm");                Dictionary<string, XmlElement> nodePop = new Dictionary<string, XmlElement>();                foreach (string key in PopEnable.Keys)                {                    nodePop.Add(key, _doc.CreateElement(key));                }                XmlElement nodeStep = _doc.CreateElement("Step");                if (ToleranceEnable)                {                    nodeStep.AppendChild(nodeWarning);                    nodeStep.AppendChild(nodeAlarm);                }                nodeStep.SetAttribute("StepNo", parameters.StepNo.ToString());                nodeStep.SetAttribute("Name", parameters.Name);           //     nodeStep.SetAttribute("UseTemp", parameters.UseTemp);                nodeModule.AppendChild(nodeStep);                i++;            }            XmlElement nodeConfig = _doc.CreateElement("Config");            foreach (Param parameter in ConfigItems)            {                if (parameter.Visible == System.Windows.Visibility.Visible)                {                    if (parameter is IntParam)                        nodeConfig.SetAttribute(parameter.Name, ((IntParam)parameter).Value.ToString());                    else if (parameter is DoubleParam)                    {                        string strValue = ((DoubleParam)parameter).Value;                        bool succed = double.TryParse(strValue, out double dValue);                        if (!succed)                        {                            MessageBox.Show($"The set value of {parameter.DisplayName} is {strValue}, not a valid value");                            return null;                        }                        var config = ConfigItems.Where(m => m.Name == parameter.Name).FirstOrDefault();                        if (config is DoubleParam param1)                        {                            if (param1.Minimun == 0 && param1.Maximun == 0)                            {                                //没有设定范围                            }                            else if (dValue > param1.Maximun || dValue < param1.Minimun)                            {                                MessageBox.Show($"The set value of {parameter.DisplayName} is {dValue}, out of the range {param1.Minimun}~{param1.Maximun}");                                return null;                            }                        }                        nodeConfig.SetAttribute(parameter.Name, ((DoubleParam)parameter).Value.ToString());                    }                    else if (parameter is StringParam)                        nodeConfig.SetAttribute(parameter.Name, ((StringParam)parameter).Value.ToString());                    else if (parameter is ComboxParam)                        nodeConfig.SetAttribute(parameter.Name, ((ComboxParam)parameter).Value.ToString());                    else if (parameter is LoopComboxParam)                        nodeConfig.SetAttribute(parameter.Name, ((LoopComboxParam)parameter).Value.ToString());                    else if (parameter is PositionParam)                        nodeConfig.SetAttribute(parameter.Name, ((PositionParam)parameter).Value.ToString());                    else if (parameter is BoolParam)                        nodeConfig.SetAttribute(parameter.Name, ((BoolParam)parameter).Value.ToString());                    else if (parameter is StepParam)                        nodeConfig.SetAttribute(parameter.Name, ((StepParam)parameter).Value.ToString());                    else if (parameter is MultipleSelectParam)                    {                        List<string> selected = new List<string>();                        ((MultipleSelectParam)parameter).Options.Apply(                             opt =>                             {                                 if (opt.IsChecked)                                     selected.Add(opt.ControlName);                             }                                                    );                        nodeConfig.SetAttribute(parameter.Name, string.Join(",", selected));                    }                }            }            nodeModule.AppendChild(nodeConfig);            return _doc.OuterXml;        }        private void SetAttribute(ObservableCollection<Param> Parameters, XmlElement PopSettingStep)        {            if (Parameters != null)                foreach (Param parameter1 in Parameters)                {                    if (parameter1.Visible != System.Windows.Visibility.Visible)                        continue;                    if (parameter1 is IntParam)                        PopSettingStep.SetAttribute(parameter1.Name, ((IntParam)parameter1).Value.ToString());                    else if (parameter1 is DoubleParam)                        PopSettingStep.SetAttribute(parameter1.Name, ((DoubleParam)parameter1).Value.ToString());                    else if (parameter1 is StringParam)                        PopSettingStep.SetAttribute(parameter1.Name, ((StringParam)parameter1).Value.ToString());                    else if (parameter1 is ComboxParam)                        PopSettingStep.SetAttribute(parameter1.Name, ((ComboxParam)parameter1).Value.ToString());                    else if (parameter1 is LoopComboxParam)                        PopSettingStep.SetAttribute(parameter1.Name, ((LoopComboxParam)parameter1).Value.ToString());                    else if (parameter1 is PositionParam)                        PopSettingStep.SetAttribute(parameter1.Name, ((PositionParam)parameter1).Value.ToString());                    else if (parameter1 is BoolParam)                        PopSettingStep.SetAttribute(parameter1.Name, ((BoolParam)parameter1).Value.ToString());                    else if (parameter1 is StepParam)                        PopSettingStep.SetAttribute(parameter1.Name, ((StepParam)parameter1).Value.ToString());                    else if (parameter1 is MultipleSelectParam)                    {                        List<string> selected1 = new List<string>();                        ((MultipleSelectParam)parameter1).Options.Apply(                            opt =>                            {                                if (opt.IsChecked)                                    selected1.Add(opt.ControlName);                            }                            );                        PopSettingStep.SetAttribute(parameter1.Name, string.Join(",", selected1));                    }                }        }        public string ToXmlString()        {            StringBuilder builder = new StringBuilder();            builder.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");            builder.Append(string.Format("<Aitex><TableRecipeData CreatedBy=\"{0}\" CreationTime=\"{1}\" LastRevisedBy=\"{2}\" LastRevisionTime=\"{3}\" Description=\"{4}\"  RecipeChamberType=\"{5}\" RecipeVersion=\"{6}\" TableNumber=\"{7}\">", this.Creator, this.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"), this.Revisor, this.ReviseTime.ToString("yyyy-MM-dd HH:mm:ss"), this.Description, ChamberType, Version, TableNumber));            foreach (ParameterTable parameters in Steps)            {                builder.Append("<Step ");                builder.Append("Name=\"" + parameters.Name + "\" ");                builder.Append("/>");            }            //builder.Append("<Config ");            //foreach (Param parameter in ConfigItems)            //{            //    if (parameter.Visible == System.Windows.Visibility.Visible)            //    {            //        if (parameter is IntParam)            //            builder.Append(parameter.Name + "=\"" + ((IntParam)parameter).Value + "\" ");            //        else if (parameter is DoubleParam)            //            builder.Append(parameter.Name + "=\"" + ((DoubleParam)parameter).Value + "\" ");            //        else if (parameter is StringParam)            //            builder.Append(parameter.Name + "=\"" + ((StringParam)parameter).Value + "\" ");            //        else if (parameter is ComboxParam)            //            builder.Append(parameter.Name + "=\"" + ((ComboxParam)parameter).Value + "\" ");            //        else if (parameter is LoopComboxParam)            //            builder.Append(parameter.Name + "=\"" + ((LoopComboxParam)parameter).Value + "\" ");            //        else if (parameter is PositionParam)            //            builder.Append(parameter.Name + "=\"" + ((PositionParam)parameter).Value + "\" ");            //        else if (parameter is BoolParam)            //            builder.Append(parameter.Name + "=\"" + ((BoolParam)parameter).Value + "\" ");            //        else if (parameter is StepParam)            //            builder.Append(parameter.Name + "=\"" + ((StepParam)parameter).Value + "\" ");            //        else if (parameter is MultipleSelectParam)            //        {            //            List<string> selected = new List<string>();            //            ((MultipleSelectParam)parameter).Options.Apply(            //                opt =>            //                {            //                    if (opt.IsChecked)            //                        selected.Add(opt.ControlName);            //                }            //                );            //            builder.Append(parameter.Name + "=\"" + string.Join(",", selected) + "\" ");            //        }            //    }            //}            builder.Append("/>");            builder.Append("</TableRecipeData></Aitex>");            return builder.ToString();        }    }    public class ParameterTable : PropertyChangedBase    {        public string Value { get; set; }        private int _stepNo;        public int StepNo        {            get => _stepNo; set            {                _stepNo = value;                NotifyOfPropertyChange("StepNo");            }        }        private string _name;        public string Name        {            get => _name; set            {                _name = value;                NotifyOfPropertyChange("Name");            }        }        private string _useTemp;        public string UseTemp        {            get => _useTemp;            set            {                _useTemp = value;                NotifyOfPropertyChange("UseTemp");            }        }        private bool _isChecked;        public bool IsChecked {            get=> _isChecked;            set            {                _isChecked = value;                NotifyOfPropertyChange("IsChecked");            } }        public Visibility IsVisibility { get; set; } = Visibility.Visible;               public ParameterTable() { }        public ParameterTable Clone()//深拷贝        {            return this.MemberwiseClone() as ParameterTable;        }        public ParameterTable(ParameterDataBase recipeData)        {            if (recipeData.Steps.Count <= 0) return;            SetCurrentRecipeStep(recipeData, recipeData.Steps[0]);        }        public ParameterTable(ParameterDataBase recipeData, int selectedStepNo)        {            ParameterTable step = recipeData.Steps.Where(x => x.StepNo == selectedStepNo).FirstOrDefault();            SetCurrentRecipeStep(recipeData, step);        }        public virtual void SetCurrentRecipeStep(ParameterDataBase recipeData, ParameterTable step)        {        }    }    }
 |