Delphi. Обратная связь через LiveBindings

Используется следующее решение для редактирования полей объекта с помощью LiveBindings

И не очень пойму, как, если в методе write объекта, свойство обновляется с условием, заставить механизм LiveBindings "перечитать" значение в контрол.

Т.е. в Edit ввели 200, в FA записалось 200, на форме видим 200. Если ввели 0, то в FA будет 100 (из-за условия в SetA), а в Edit отображается 0.

P.S. Поскольку здесь Nodify висит на OnEditChange - то пример не совсем корректен с точки зрения ввода и обработки данных.

unit Unit4;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Data.Bind.EngExt, Vcl.Bind.DBEngExt, System.Rtti, System.Bindings.Outputs,
  Vcl.Bind.Editors, Data.Bind.Components, Vcl.StdCtrls;

type
  TSimple = class
  private
    FA: Integer;
    procedure SetA(const Value: Integer);
  published
   constructor Create (Value : Integer);
   property A: Integer read FA write SetA;
  end;


  TForm4 = class(TForm)
    bndngslst1: TBindingsList;
    edt1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure edt1Change(Sender: TObject);
  private
    { Private declarations }
   bndscp1: TBindScope;
  public
    { Public declarations }
   procedure  CreateExpression (AControlComponent: TComponent;
    AControlProperty, ASourceProperty: string; ABindScope: TBindScope;
    ABindingsList: TBindingsList);
   procedure InitializeBinding; virtual;

  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

{ TForm4 }

procedure TForm4.CreateExpression(AControlComponent: TComponent;
  AControlProperty, ASourceProperty: string; ABindScope: TBindScope;
  ABindingsList: TBindingsList);
var Expression: TBindExpression;
begin
  {создаем выражение}
  Expression := TBindExpression.Create(self);
  {назначаем компонент для отображения информации}
  Expression.ControlComponent := AControlComponent;
  {Указываем в какое свойство выводить данные}
  Expression.ControlExpression := AControlProperty;
  {указываем точку доступа - тут должен содержаться наш класс}
  Expression.SourceComponent := ABindScope;
  {Тут указываем свойство КЛАССА, которое будет выводится в AControlProperty}
  Expression.SourceExpression := ASourceProperty;
  {Обеспечиваем двухстороннюю связь - будем и читать и писать свойство}
  Expression.Direction := TExpressionDirection.dirBidirectional;
  {Назначаем список}
  expression.BindingsList := ABindingsList;
end;

procedure TForm4.edt1Change(Sender: TObject);
begin
  bndngslst1.Notify(Sender,'');
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
 bndscp1 := TBindScope.Create(Self);
 InitializeBinding;
end;

procedure TForm4.InitializeBinding;
begin
  CreateExpression(edt1,'Text','A',bndscp1,bndngslst1);
  bndscp1.DataObject:= TSimple.Create(200);
end;

{ TSimple }

constructor TSimple.Create(Value: Integer);
begin
 inherited Create;
 FA := 200;
end;

procedure TSimple.SetA(const Value: Integer);
begin
  FA := Value;
  if Value < 100 then
    FA := 100;
end;

Ответы (0 шт):