2023-06-16 16:32:39 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
using System.ComponentModel;
|
2023-06-13 16:10:57 +08:00
|
|
|
|
using System.Diagnostics;
|
2023-06-16 17:36:49 +08:00
|
|
|
|
using MECF.Framework.UI.Client.CenterViews.Configs.Roles;
|
2023-06-16 16:32:39 +08:00
|
|
|
|
using MECF.Framework.UI.Client.ClientBase;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
2023-05-10 16:21:45 +08:00
|
|
|
|
namespace MECF.Framework.UI.Client.RecipeEditorLib.RecipeModel.Params
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
2023-06-16 16:32:39 +08:00
|
|
|
|
public abstract class ParamBaseWithGenericValue<TValue> : Param, IValueParam
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
|
|
|
|
#region Variables
|
|
|
|
|
|
2023-06-16 16:32:39 +08:00
|
|
|
|
public event EventHandler<object> OnValueChanged;
|
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
protected TValue _value;
|
|
|
|
|
protected TValue _valueSnapshot;
|
|
|
|
|
protected IParam _previous;
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Constructors
|
|
|
|
|
|
|
|
|
|
protected ParamBaseWithGenericValue()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected ParamBaseWithGenericValue(TValue initValue) : this()
|
|
|
|
|
{
|
|
|
|
|
if (initValue.GetType() != typeof(TValue))
|
|
|
|
|
initValue = default;
|
|
|
|
|
|
|
|
|
|
_value = initValue;
|
|
|
|
|
_valueSnapshot = initValue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Properties
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public virtual TValue Value
|
|
|
|
|
{
|
|
|
|
|
get => _value;
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_value = value;
|
2023-06-15 19:19:41 +08:00
|
|
|
|
NotifyOfPropertyChange();
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
2023-06-16 13:43:26 +08:00
|
|
|
|
ColumnPermChangedCallback?.Invoke(this);
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
|
|
|
|
_isSaved = _value.Equals(_valueSnapshot);
|
|
|
|
|
NotifyOfPropertyChange(nameof(IsSaved));
|
|
|
|
|
|
|
|
|
|
// 当Value发生变化时,要办一下事项,以及时刷新UI状态。
|
|
|
|
|
CheckValueEqualityWithPrevious();
|
|
|
|
|
Validate();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override IParam Previous
|
|
|
|
|
{
|
|
|
|
|
get => _previous;
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
//! 如果前序参数的Value发生了变化,则需要通知我进行比较,以确定我的Value是否和前序参数的Value相等。
|
|
|
|
|
|
|
|
|
|
// 注销之前注册的事件。
|
|
|
|
|
if (_previous is Param preParam)
|
|
|
|
|
preParam.PropertyChanged -= OnPreviousParamValueChanged;
|
|
|
|
|
|
|
|
|
|
_previous = value;
|
|
|
|
|
|
|
|
|
|
// 注册事件.
|
|
|
|
|
if (_previous is Param p)
|
|
|
|
|
{
|
|
|
|
|
p.PropertyChanged += OnPreviousParamValueChanged;
|
|
|
|
|
|
|
|
|
|
// 立即执行一次比较
|
|
|
|
|
CheckValueEqualityWithPrevious();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override IParam Next { get; set; }
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Methods
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 判断Value属性是否相等。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="v1"></param>
|
|
|
|
|
/// <param name="v2"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
protected static bool IsTValueEqual(TValue v1, TValue v2)
|
|
|
|
|
{
|
|
|
|
|
return Comparer<TValue>.Default.Compare(v1, v2) == 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 检查我的Value是否和前序参数的Value相等。
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void CheckValueEqualityWithPrevious()
|
|
|
|
|
{
|
|
|
|
|
if (_previous is ParamBaseWithGenericValue<TValue> valuedParam)
|
|
|
|
|
{
|
|
|
|
|
IsEqualsToPrevious = IsTValueEqual(_value, valuedParam.Value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 当前序参数的Value发生变化时,判断其是否和我的Value属性相等。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
private void OnPreviousParamValueChanged(object sender, PropertyChangedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (e.PropertyName == nameof(Value) && _previous is ParamBaseWithGenericValue<TValue> valuedParam)
|
|
|
|
|
{
|
|
|
|
|
IsEqualsToPrevious = IsTValueEqual(_value, valuedParam.Value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 保存数据。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public override void Save()
|
|
|
|
|
{
|
|
|
|
|
_valueSnapshot = _value;
|
|
|
|
|
base.Save();
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-16 16:32:39 +08:00
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public virtual object GetValue()
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
2023-06-16 17:36:49 +08:00
|
|
|
|
if (Permission == MenuPermissionEnum.MP_NONE)
|
2023-06-16 17:40:56 +08:00
|
|
|
|
//throw new PermissionException(Permission);
|
|
|
|
|
return null;
|
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
return Value;
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-16 16:32:39 +08:00
|
|
|
|
public void SetValue(object value)
|
|
|
|
|
{
|
|
|
|
|
if (Permission != MenuPermissionEnum.MP_READ_WRITE)
|
2023-06-16 17:40:56 +08:00
|
|
|
|
//throw new PermissionException(Permission);
|
|
|
|
|
return;
|
2023-06-16 16:32:39 +08:00
|
|
|
|
|
|
|
|
|
HandleSetValue(value);
|
|
|
|
|
OnValueChanged?.Invoke(this, value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual void HandleSetValue(object value)
|
2023-06-13 16:10:57 +08:00
|
|
|
|
{
|
|
|
|
|
Debug.Assert(value.GetType() == typeof(TValue), "The type of value does not match to my type.");
|
|
|
|
|
Value = (TValue)value;
|
|
|
|
|
}
|
2023-06-16 16:32:39 +08:00
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
|
public override string ToString()
|
|
|
|
|
{
|
|
|
|
|
return $"{base.ToString()}, Value={_value}";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|