Here is the way to make TUniEdit observable by LiveBindings :
unit UniObservableEdit;
interface
uses
System.SysUtils, System.Classes, Vcl.Controls, uniGUIBaseClasses,
uniGUIClasses, uniEdit,
WinApi.Messages, WinApi.CommCtrl,
Data.Bind.Components;
type
[ObservableMember('Text')] { identifies the control value name for TUniObservableEdit }
TUniObservableEdit = class(TUniEdit)
private
procedure ObserverToggle(const AObserver: IObserver; const Value: Boolean);
procedure DoSetRemoteValue(AIndex:Integer;Value:String);override;
protected
function CanObserve(const ID: Integer): Boolean; override; { declaration is in System.Classes }
procedure ObserverAdded(const ID: Integer; const Observer: IObserver); override; { declaration is in System.Classes }
public
published
end;
procedure Register;
implementation
function TUniObservableEdit.CanObserve(const ID: Integer): Boolean;
{ Controls which implement observers always override TComponent.CanObserve(const ID: Integer). }
{ This method identifies the type of observers supported by TUniObservableEdit. }
begin
case ID of
TObserverMapping.EditLinkID, { EditLinkID is the observer that is used for control-to-field links }
TObserverMapping.ControlValueID:
Result := True;
else
Result := False;
end;
end;
{ The override for DoSetRemoteValue is where TUniObservableEdit calls the
observable interfaces to notify LiveBindings components when the user types something.
This override is sufficient to monitor user input to TUniObservableEdit.
TLinkObservers.ControlChanged is a utility method that does most of the work. You can
find the implementation in System.Classes. }
procedure TUniObservableEdit.DoSetRemoteValue(AIndex:Integer;Value:String);
begin
inherited;
TLinkObservers.ControlChanged(Self);
end;
procedure TUniObservableEdit.ObserverAdded(const ID: Integer;
const Observer: IObserver);
begin
inherited;
if ID = TObserverMapping.EditLinkID then
Observer.OnObserverToggle := ObserverToggle;
end;
procedure TUniObservableEdit.ObserverToggle(const AObserver: IObserver;
const Value: Boolean);
var
LEditLinkObserver: IEditLinkObserver;
begin
if Value then
begin
if Supports(AObserver, IEditLinkObserver, LEditLinkObserver) then
{ disable the uniEdit if the associated field does not support editing }
Enabled := not LEditLinkObserver.IsReadOnly;
end else
Enabled := True;
end;
procedure Register;
begin
RegisterComponents('uniObservableComponents', [TUniObservableEdit]);
end;
initialization
Data.Bind.Components.RegisterObservableMember(TArray<TClass>.Create(TUniObservableEdit), 'Text', 'DFM');
finalization
Data.Bind.Components.UnregisterObservableMember(TArray<TClass>.Create(TUniObservableEdit));
end.