using System; using System.Collections.Generic; namespace XericUI.ReflectionUIGenerator { /// /// 值绑定模板 /// 为单个元数据成员创建的 MVVM 双向绑定,包含读/写委托和脏标记 /// 支持通过 SubBindings 实现拆分属性的子绑定 /// public class AvrgMvvmBinding { /// 关联的元数据 public AvrgMemberMetaData MetaData { get; set; } /// 从数据源读取值的委托 public Func ReadFunc { get; set; } /// 写入值到数据源的委托 public Action WriteAction { get; set; } /// /// 值访问器引用(在 BuildMDVM 时创建,供 UI 组件使用) /// 提供 ValueType / IsReadOnly / FormatDisplay 等扩展能力 /// public IAvrgValueAccessor Accessor { get; set; } /// /// 拆分属性子绑定列表 /// 由 [XuiavrgSplit] 特性展开生成,每个子绑定对应一个拆分后的子属性 /// public List SubBindings { get; set; } // ============ 脏标记 ============ /// UI 侧是否标记为脏 public bool IsUIDirty { get; set; } /// 数据侧是否标记为脏 public bool IsDataDirty { get; set; } /// UI 侧写入的缓存值 public object UICachedValue { get; set; } /// 数据侧写入的缓存值 public object DataCachedValue { get; set; } // ============ 验证状态 ============ private ValidationState _validationState = ValidationState.Normal; /// 当前验证状态 public ValidationState CurrentValidationState => _validationState; /// 验证状态变更事件 — UI 组件订阅以切换样式 public event Action OnValidationStateChanged; /// /// 校验值是否满足元数据约束 /// 返回:Normal(通过)、Warning(放行但警告)、Invalid(驳回) /// public ValidationState ValidateValue(object value) { if (MetaData == null) return ValidationState.Normal; // 1. 空值检查(Required) if (MetaData.Required && (value == null || (value is string s && string.IsNullOrEmpty(s)))) return ValidationState.Invalid; // 2. 范围检查(RangeMin/RangeMax) if (value is IConvertible) { float num = Convert.ToSingle(value); if (MetaData.RangeMin.HasValue && num < MetaData.RangeMin.Value) return ValidationState.Invalid; if (MetaData.RangeMax.HasValue && num > MetaData.RangeMax.Value) return ValidationState.Invalid; } return ValidationState.Normal; } /// 更新验证状态并触发回调(仅状态变化时触发) internal void SetValidationState(ValidationState newState) { if (_validationState != newState) { _validationState = newState; OnValidationStateChanged?.Invoke(_validationState); } } /// 重置验证状态为 Normal(不触发事件) internal void ResetValidationState() { _validationState = ValidationState.Normal; } // ============ UI 绑定 ============ /// UI 值变更回调委托 — UI 组件订阅此回调以更新显示(附带验证状态) public Action OnUIDataChanged; /// 通知 UI 更新值(带验证状态) public void NotifyUIUpdate(object value, ValidationState state) { OnUIDataChanged?.Invoke(value, state); } /// 清除所有 UI 变更订阅 public void ClearUIEvent() { OnUIDataChanged = null; OnValidationStateChanged = null; } // ============ 便捷方法 ============ /// /// UI 侧写入值(标记脏,不立即传播) /// public void WriteFromUI(object value) { UICachedValue = value; IsUIDirty = true; } /// /// 数据侧写入值(标记脏,不立即传播) /// public void WriteFromData(object value) { DataCachedValue = value; IsDataDirty = true; } /// /// 从数据源读取当前值 /// public object ReadFromDataSource() { return ReadFunc?.Invoke(); } /// /// 将值实际写入数据源 /// public void CommitToDataSource(object value) { WriteAction?.Invoke(value); } /// /// 重置脏标记 /// public void ClearDirty() { IsUIDirty = false; IsDataDirty = false; UICachedValue = null; DataCachedValue = null; } } }