using GFramework.Core.Abstractions.events;
using GFramework.Core.Abstractions.property;
namespace GFramework.Core.property;
///
/// 可绑定属性类,用于实现数据绑定功能
/// 线程安全:所有公共方法都是线程安全的
///
/// 属性值的类型
/// 属性的默认值
public class BindableProperty(T defaultValue = default!) : IBindableProperty
{
///
/// 用于保护委托链和值访问的锁对象
///
private readonly object _lock = new();
///
/// 属性值变化事件回调委托,当属性值发生变化时被调用
///
private Action? _mOnValueChanged;
///
/// 存储属性实际值的受保护字段
///
protected T MValue = defaultValue;
///
/// 获取或设置属性值比较器,默认使用Equals方法进行比较
///
public static Func Comparer { get; set; } = (a, b) => a!.Equals(b);
///
/// 获取或设置属性值,当值发生变化时会触发注册的回调事件
///
public T Value
{
get => GetValue();
set
{
Action? callback = null;
lock (_lock)
{
// 使用 default(T) 替代 null 比较,避免 SonarQube 警告
if (EqualityComparer.Default.Equals(value, default!) &&
EqualityComparer.Default.Equals(MValue, default!))
return;
// 若新值与旧值相等则不执行后续操作
if (!EqualityComparer.Default.Equals(value, default!) && Comparer(value, MValue))
return;
SetValue(value);
callback = _mOnValueChanged;
}
// 在锁外调用回调,避免死锁
callback?.Invoke(value);
}
}
///
/// 直接设置属性值而不触发事件
///
/// 新的属性值
public void SetValueWithoutEvent(T newValue)
{
lock (_lock)
{
MValue = newValue;
}
}
///
/// 实现IEasyEvent接口的注册方法,将无参事件转换为有参事件处理
///
/// 无参事件回调
/// 可用于取消注册的接口
IUnRegister IEvent.Register(Action onEvent)
{
return Register(Action);
void Action(T _)
{
onEvent();
}
}
///
/// 注册属性值变化事件回调
///
/// 属性值变化时的回调函数
/// 可用于取消注册的接口
public IUnRegister Register(Action onValueChanged)
{
lock (_lock)
{
_mOnValueChanged += onValueChanged;
}
return new BindablePropertyUnRegister(this, onValueChanged);
}
///
/// 注册属性值变化事件回调,并立即调用回调函数传递当前值
///
/// 属性值变化时的回调函数
/// 可用于取消注册的接口
public IUnRegister RegisterWithInitValue(Action action)
{
T currentValue;
lock (_lock)
{
currentValue = MValue;
}
action(currentValue);
return Register(action);
}
///
/// 取消注册属性值变化事件回调
///
/// 要取消注册的回调函数
public void UnRegister(Action onValueChanged)
{
lock (_lock)
{
_mOnValueChanged -= onValueChanged;
}
}
///
/// 设置自定义比较器
///
/// 用于比较两个值是否相等的函数
/// 当前可绑定属性实例
public BindableProperty WithComparer(Func comparer)
{
Comparer = comparer;
return this;
}
///
/// 设置属性值的虚方法,可在子类中重写
///
/// 新的属性值
protected virtual void SetValue(T newValue)
{
MValue = newValue;
}
///
/// 获取属性值的虚方法,可在子类中重写
///
/// 当前属性值
protected virtual T GetValue()
{
lock (_lock)
{
return MValue;
}
}
///
/// 返回属性值的字符串表示形式
///
/// 属性值的字符串表示
public override string ToString()
{
return Value?.ToString() ?? string.Empty;
}
}