Delphi 10.4 LiveBinding双向绑定TStrings到TMemo回写转换报错
问题根因
这是Delphi RTL中TObjectBindSourceAdapter的已知设计缺陷:当处理类的TStrings类型属性时,适配器在反向绑定(控件到对象)场景下,会丢失属性的实际类型信息,把TStrings属性误识别为TObject类型,导致无法匹配到已注册的string到TStrings转换器。
可行解决方案
方案1:自定义绑定转换器,显式注册string到TObject的转换规则(侵入性最低,无需修改原有业务逻辑)
在程序初始化阶段注册自定义转换器,判断目标TObject是否为TStrings子类,匹配则执行赋值逻辑:uses System.Bindings.Outputs, System.Classes; procedure RegisterCustomStringToTStringsConverter; begin TValueRefConverterFactory.RegisterConversion(TypeInfo(string), TypeInfo(TObject), procedure(const InValue: TValue; var OutValue: TValue) var TargetStrings: TStrings; begin if OutValue.IsObject and (OutValue.AsObject is TStrings) then begin TargetStrings := TStrings(OutValue.AsObject); TargetStrings.Text := InValue.AsString; end; end ); end;在工程的
Initialization段或者主窗体的OnCreate事件中调用该方法即可生效。方案2:替换绑定字段类型,绕过TStrings转换逻辑
给TFoo类新增string类型的linesText属性,直接关联Flines的Text属性:// 类定义新增属性 published property linesText: string read GetLinesText write SetLinesText; // 实现部分 function TFoo.GetLinesText: string; begin Result := Flines.Text; end; procedure TFoo.SetLinesText(const Value: string); begin Flines.Text := Value; end;后续直接将linesText属性和Memo的Text属性做双向绑定即可。
方案3:自定义ObjectBindSourceAdapter,修正类型识别逻辑
继承TObjectBindSourceAdapter<TFoo>,重写字段类型信息的获取逻辑,强制将lines字段的类型指定为TypeInfo(TStrings),适配原有绑定规则。
注意事项
- 你之前修改的setter中使用Assign赋值是正确的,需要保留,避免TStrings实例被意外替换导致内存泄漏
- 如果同时存在多个TStrings类型属性的绑定需求,优先选择方案1,无需逐个修改业务类
内容的提问来源于stack exchange,提问作者Yandros
相关产品推荐
相关产品推荐

