2023-04-13 11:51:03 +08:00
|
|
|
|
using System;
|
2023-05-10 16:21:45 +08:00
|
|
|
|
using System.Collections.Generic;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Linq;
|
2023-06-16 15:48:27 +08:00
|
|
|
|
using MECF.Framework.UI.Client.CenterViews.Configs.Roles;
|
2023-08-22 16:58:11 +08:00
|
|
|
|
using MECF.Framework.UI.Client.CenterViews.Editors;
|
2023-06-16 15:48:27 +08:00
|
|
|
|
using MECF.Framework.UI.Client.ClientBase;
|
2023-05-10 16:21:45 +08:00
|
|
|
|
using MECF.Framework.UI.Client.RecipeEditorLib.RecipeModel.Params;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
2023-05-10 16:21:45 +08:00
|
|
|
|
namespace MECF.Framework.UI.Client.RecipeEditorLib.RecipeModel
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
|
|
|
|
public class RecipeStep : ObservableCollection<Param>
|
|
|
|
|
{
|
|
|
|
|
#region Variables
|
|
|
|
|
|
2023-06-16 15:48:27 +08:00
|
|
|
|
private MenuPermissionEnum _permission;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
private bool _isHideValue;
|
2023-05-10 16:21:45 +08:00
|
|
|
|
private bool _isProcessed;
|
2023-06-15 19:19:41 +08:00
|
|
|
|
private bool _isVisible;
|
2023-05-10 16:21:45 +08:00
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
2023-06-15 19:19:41 +08:00
|
|
|
|
/// 当步骤的任意参数的<see cref="Param.IsSaved"/>属性发生变化时,引发此事件。
|
2023-04-13 11:51:03 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
public event EventHandler<bool> SavedStateChanged;
|
2023-05-10 16:21:45 +08:00
|
|
|
|
|
2023-06-15 19:19:41 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 当前步骤的选择状态发生变化时,引发此事件。
|
|
|
|
|
/// </summary>
|
2023-06-13 16:10:57 +08:00
|
|
|
|
public event EventHandler<bool> SelectionStateChanged;
|
|
|
|
|
|
2023-06-15 19:19:41 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 当前步骤的任意参数高亮状态发生变化时,引发此事件。
|
|
|
|
|
/// </summary>
|
2023-06-15 14:53:21 +08:00
|
|
|
|
public event EventHandler HighlightStateChanged;
|
|
|
|
|
|
2023-06-15 19:19:41 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 当前步骤的气体流量计算完成后,引发此事件。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public event EventHandler GasFlowCalculated;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
2023-06-29 16:23:08 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 当步骤的时长发生变化时,引发此事件。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public event EventHandler StepTimeChanged;
|
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Constructors
|
|
|
|
|
|
|
|
|
|
public RecipeStep(RecipeStep previous)
|
|
|
|
|
{
|
|
|
|
|
Previous = previous;
|
|
|
|
|
IsSaved = true;
|
2023-06-16 13:43:26 +08:00
|
|
|
|
IsVisible = true;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Properties
|
2023-05-10 16:21:45 +08:00
|
|
|
|
|
2023-06-16 15:48:27 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 设置或返回当前步骤的访问权限。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public MenuPermissionEnum Permission
|
|
|
|
|
{
|
|
|
|
|
get => _permission;
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_permission = value;
|
|
|
|
|
this.ToList().ForEach(x => x.StepPermission = _permission);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 父级配方集合。
|
|
|
|
|
/// </summary>
|
2023-05-10 16:21:45 +08:00
|
|
|
|
public RecipeData Parent { get; internal set; }
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回配方步骤序号参数。
|
|
|
|
|
/// </summary>
|
2023-06-13 16:10:57 +08:00
|
|
|
|
public StepParam StepNoParam => this.FirstOrDefault(param => param.Name == RecipeFormatBuilder.SPEC_COL_STEPNO) as StepParam;
|
|
|
|
|
|
|
|
|
|
private StringParam UidParam => this.FirstOrDefault(param => param.Name == RecipeFormatBuilder.SPEC_COL_STEPUID) as StringParam;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
2023-06-13 16:10:57 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回当前步骤是否被选中。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public bool IsSelected
|
|
|
|
|
{
|
|
|
|
|
get => StepNoParam?.IsChecked ?? false;
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
if (StepNoParam != null)
|
|
|
|
|
StepNoParam.IsChecked = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-05-10 16:21:45 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 当前配方步骤的唯一识别码。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public string StepUid
|
|
|
|
|
{
|
|
|
|
|
get => UidParam?.Value ?? null;
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
var paramUid = UidParam;
|
|
|
|
|
if (paramUid != null)
|
|
|
|
|
{
|
|
|
|
|
paramUid.Value = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回步骤序号。
|
|
|
|
|
/// </summary>
|
2023-06-13 16:10:57 +08:00
|
|
|
|
public int? StepNo => StepNoParam?.Value;
|
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回步骤执行时长。
|
|
|
|
|
/// </summary>
|
2023-05-10 23:21:46 +08:00
|
|
|
|
public double StepTime
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
2023-05-10 23:21:46 +08:00
|
|
|
|
var param = FindParamByControlName(RecipeControlNames.STEP_TIME);
|
|
|
|
|
if(param is DoubleParam dblParam)
|
|
|
|
|
return dblParam.Value;
|
|
|
|
|
|
|
|
|
|
return 0d;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回当前配方步骤是否已保存。
|
|
|
|
|
/// </summary>
|
2023-05-10 16:21:45 +08:00
|
|
|
|
public bool IsSaved { get; private set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回当前步骤是否已经跑完工艺。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public bool IsProcessed
|
|
|
|
|
{
|
|
|
|
|
get => _isProcessed;
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
if (_isProcessed != value)
|
|
|
|
|
{
|
|
|
|
|
_isProcessed = value;
|
|
|
|
|
OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsProcessed)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回前序配方。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public RecipeStep Previous { get; private set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回后序配方。
|
|
|
|
|
/// </summary>
|
2023-05-10 16:21:45 +08:00
|
|
|
|
public RecipeStep Next { get; private set; }
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
2023-06-15 19:19:41 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 设置或返回当前步骤是否在DataGrid中显示。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public bool IsVisible
|
|
|
|
|
{
|
|
|
|
|
get => _isVisible;
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_isVisible = value;
|
|
|
|
|
OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsVisible)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Methods
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 当配方中的参数的属性发生变化时,触发此事件。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
/// <param name="e"></param>
|
2023-06-15 14:53:21 +08:00
|
|
|
|
private void OnParamPropertyChanged(object sender, PropertyChangedEventArgs e)
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
2023-06-15 14:53:21 +08:00
|
|
|
|
if (sender is not IParam param)
|
2023-04-13 11:51:03 +08:00
|
|
|
|
return;
|
|
|
|
|
|
2023-06-29 16:23:08 +08:00
|
|
|
|
switch (e.PropertyName)
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
2023-06-29 16:23:08 +08:00
|
|
|
|
case nameof(Param.IsSaved):
|
|
|
|
|
{
|
|
|
|
|
if (param.IsSaved == false)
|
|
|
|
|
IsSaved = false;
|
|
|
|
|
else
|
|
|
|
|
IsSaved = this.ToList().FirstOrDefault(x => x.IsSaved == false) == null;
|
2023-06-15 14:53:21 +08:00
|
|
|
|
|
2023-06-29 16:23:08 +08:00
|
|
|
|
SavedStateChanged?.Invoke(this, IsSaved);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case nameof(StepParam.IsChecked):
|
|
|
|
|
OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsSelected)));
|
|
|
|
|
SelectionStateChanged?.Invoke(this, IsSelected);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case nameof(Param.IsHighlighted):
|
|
|
|
|
HighlightStateChanged?.Invoke(this, EventArgs.Empty);
|
|
|
|
|
break;
|
2023-06-15 14:53:21 +08:00
|
|
|
|
}
|
2023-06-13 16:10:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 当配方中的参数的值发生变化时,触发此事件。
|
|
|
|
|
/// </summary>
|
2023-06-29 16:23:08 +08:00
|
|
|
|
/// <remarks>
|
|
|
|
|
/// 该事件在DragToFill操作时会被触发。
|
|
|
|
|
/// 单元格编辑完成后参数值发生变化不会引发此事件,而是直接在CellEndEditing事件中处理。
|
|
|
|
|
/// </remarks>
|
2023-06-13 16:10:57 +08:00
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
/// <exception cref="NotImplementedException"></exception>
|
2023-06-15 14:53:21 +08:00
|
|
|
|
private void OnParamValueChanged(object sender, object e)
|
2023-06-13 16:10:57 +08:00
|
|
|
|
{
|
2023-06-29 16:23:08 +08:00
|
|
|
|
if (sender is Param para and IValueParam )
|
|
|
|
|
{
|
|
|
|
|
if (para.Name == RecipeControlNames.STEP_TIME)
|
|
|
|
|
{
|
|
|
|
|
StepTimeChanged?.Invoke(this, EventArgs.Empty);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
//TODO 和气体不相关的参数修改后,不应该触发气体流量计算过程
|
|
|
|
|
CalculateGasFlow();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-05-10 16:21:45 +08:00
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 将指定的Param链接到前序Param。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="param">当前Step中的参数。</param>
|
|
|
|
|
private void LinkWithPreviousParam(IParam param)
|
|
|
|
|
{
|
|
|
|
|
var preParam = Previous?.FirstOrDefault(x => x.Name == param.Name);
|
|
|
|
|
param.Previous = preParam;
|
|
|
|
|
if (preParam != null)
|
|
|
|
|
preParam.Next = param;
|
|
|
|
|
}
|
2023-05-10 16:21:45 +08:00
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 将指定的Param链接到后序Param。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="param">当前Step中的参数。</param>
|
|
|
|
|
private void LinkWithNextParam(IParam param)
|
|
|
|
|
{
|
|
|
|
|
var nextParam = Next?.FirstOrDefault(x => x.Name == param.Name);
|
|
|
|
|
param.Next = nextParam;
|
|
|
|
|
if (nextParam != null)
|
|
|
|
|
nextParam.Previous = param;
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-16 15:48:27 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 从角色配置中加载当前步骤的访问权限。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="role"></param>
|
|
|
|
|
internal void LoadPermission(MenuPermission mp)
|
|
|
|
|
{
|
|
|
|
|
var mpKey = $"Step{StepNo}";
|
|
|
|
|
if (mp.MenuPermissionDictionary.TryGetValue(mpKey, out var stepPerm))
|
|
|
|
|
Permission = stepPerm;
|
|
|
|
|
else
|
|
|
|
|
Permission = MenuPermissionEnum.MP_NONE;
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-10 16:21:45 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 在当前步骤中查找指定控制名的参数。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="controlName">
|
|
|
|
|
/// 参数控制的名称。
|
|
|
|
|
/// </param>
|
|
|
|
|
/// <param name="isIgnoreCase">
|
|
|
|
|
/// 是否区分大小写。
|
|
|
|
|
/// </param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public IParam FindParamByControlName(string controlName, bool isIgnoreCase = true)
|
|
|
|
|
{
|
|
|
|
|
return this.FirstOrDefault(x =>
|
|
|
|
|
string.Equals(x.Name, controlName,
|
|
|
|
|
isIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : StringComparison.CurrentCulture));
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 校验步骤中的所有参数。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void Validate()
|
|
|
|
|
{
|
2023-05-10 16:21:45 +08:00
|
|
|
|
this.ToList().ForEach(x => x.Validate());
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-05-11 00:29:29 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 计算当前步骤的气体流量。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void CalculateGasFlow()
|
|
|
|
|
{
|
2023-08-22 16:58:11 +08:00
|
|
|
|
if (Parent.RecipeType != RecipeType.Process)
|
|
|
|
|
return;
|
|
|
|
|
|
2023-05-11 00:29:29 +08:00
|
|
|
|
Parent?.CalculateGasFlow(this);
|
2023-06-15 19:19:41 +08:00
|
|
|
|
GasFlowCalculated?.Invoke(this, EventArgs.Empty);
|
2023-05-11 00:29:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 取消所有参数的Highlight状态。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void ResetHighlight()
|
|
|
|
|
{
|
|
|
|
|
this.ToList().ForEach(x => x.ResetHighlight());
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-10 16:21:45 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取高亮显示的参数。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public List<Param> GetHighlightedParams()
|
|
|
|
|
{
|
|
|
|
|
return this.ToList().Where(p => p.IsHighlighted).ToList();
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 保存当前配方步骤。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void Save()
|
|
|
|
|
{
|
2023-05-10 16:21:45 +08:00
|
|
|
|
this.ToList().ForEach(x => x.Save());
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 設置前序步驟。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="step"></param>
|
|
|
|
|
public void SetPreviousStep(RecipeStep step)
|
|
|
|
|
{
|
|
|
|
|
Previous = step;
|
2023-05-10 16:21:45 +08:00
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
// 调整Step中Param的链接关系
|
|
|
|
|
this.ToList().ForEach(LinkWithPreviousParam);
|
|
|
|
|
|
|
|
|
|
if (Previous == null)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// 将前序步骤的后序步骤链接到我自己。
|
|
|
|
|
Previous.Next = this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetNextStep(RecipeStep step)
|
|
|
|
|
{
|
|
|
|
|
Next = step;
|
|
|
|
|
this.ToList().ForEach(LinkWithNextParam);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 检查StepNo是否为有效值。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="stepNo"></param>
|
|
|
|
|
/// <param name="validatedStepNo"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public static bool ValidateStepNo(int? stepNo, out int validatedStepNo)
|
|
|
|
|
{
|
|
|
|
|
validatedStepNo = int.MinValue;
|
2023-06-15 19:19:41 +08:00
|
|
|
|
var isValid = stepNo >= RecipeFormatBuilder.STEP_INDEX_BASE;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
if (isValid)
|
|
|
|
|
validatedStepNo = stepNo.Value;
|
|
|
|
|
|
|
|
|
|
return isValid;
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-10 16:21:45 +08:00
|
|
|
|
|
2023-06-29 16:23:08 +08:00
|
|
|
|
#endregion
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
|
|
|
|
#region Override Methods
|
2023-05-10 16:21:45 +08:00
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
protected override void InsertItem(int index, Param item)
|
|
|
|
|
{
|
|
|
|
|
if (item != null)
|
|
|
|
|
{
|
|
|
|
|
item.Parent = this;
|
|
|
|
|
LinkWithPreviousParam(item);
|
|
|
|
|
LinkWithNextParam(item);
|
2023-05-10 16:21:45 +08:00
|
|
|
|
|
2023-06-15 14:53:21 +08:00
|
|
|
|
item.PropertyChanged += OnParamPropertyChanged;
|
2023-06-16 16:32:39 +08:00
|
|
|
|
if(item is IValueParam vp)
|
|
|
|
|
vp.OnValueChanged += OnParamValueChanged;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
base.InsertItem(index, item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void SetItem(int index, Param item)
|
|
|
|
|
{
|
|
|
|
|
throw new NotSupportedException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void RemoveItem(int index)
|
|
|
|
|
{
|
|
|
|
|
if (Count > 0)
|
|
|
|
|
{
|
|
|
|
|
if (index >= 0 && index < Count)
|
|
|
|
|
{
|
2023-06-15 14:53:21 +08:00
|
|
|
|
this[index].PropertyChanged -= OnParamPropertyChanged;
|
2023-06-16 16:32:39 +08:00
|
|
|
|
|
|
|
|
|
if(this[index] is IValueParam vp)
|
|
|
|
|
vp.OnValueChanged -= OnParamValueChanged;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 将前后两个Param链接起来
|
|
|
|
|
var preParam = this[index].Previous;
|
|
|
|
|
var nextParam = this[index].Next;
|
|
|
|
|
if (preParam != null && nextParam != null)
|
|
|
|
|
{
|
|
|
|
|
preParam.Next = nextParam;
|
|
|
|
|
nextParam.Previous = preParam;
|
|
|
|
|
}
|
|
|
|
|
else if (preParam == null && nextParam != null)
|
|
|
|
|
{
|
|
|
|
|
nextParam.Previous = null;
|
|
|
|
|
}
|
|
|
|
|
else if (preParam != null)
|
|
|
|
|
{
|
|
|
|
|
preParam.Next = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IsSaved = false;
|
|
|
|
|
SavedStateChanged?.Invoke(this, true);
|
|
|
|
|
|
|
|
|
|
base.RemoveItem(index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void ClearItems()
|
|
|
|
|
{
|
2023-06-13 16:10:57 +08:00
|
|
|
|
this.ToList().ForEach(x =>
|
|
|
|
|
{
|
2023-06-15 14:53:21 +08:00
|
|
|
|
x.PropertyChanged -= OnParamPropertyChanged;
|
2023-06-16 16:32:39 +08:00
|
|
|
|
|
|
|
|
|
if(x is IValueParam vp)
|
|
|
|
|
vp.OnValueChanged -= OnParamValueChanged;
|
2023-06-13 16:10:57 +08:00
|
|
|
|
});
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
|
|
|
|
IsSaved = Count <= 0;
|
|
|
|
|
SavedStateChanged?.Invoke(this, true);
|
|
|
|
|
|
|
|
|
|
base.ClearItems();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override string ToString()
|
|
|
|
|
{
|
2023-06-13 16:10:57 +08:00
|
|
|
|
return Count > 0 ? (StepNoParam == null
|
|
|
|
|
? "Recipe Step, Item={Count}" : StepNoParam.ToString())
|
|
|
|
|
: "Empty Recipe Step";
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|