Значение LiveBinding не может быть установлено кодом

Существует TToolbar, значение которого связано с TText.Text.
Если я изменю значение TToolbar, TText.Text также изменится. Пока все работает нормально.
Если я установлю значение TToolbar вручную, привязка не повлияет: значение TToolbar изменяется, а текст - нет.

Есть ли способ активировать LiveBinding по коду?

Конечно, я могу отдельно установить TToolbar.Value и TLabel.Text вручную, как показано в приведенном ниже коде, но это будет означать
- склонен к сбою из-за избыточного кода при настройке Label1.Text
- не очень удобно в более сложных ситуациях LiveBinding

Пример кода Delphi FMX:

    unit Unit1;

    interface

    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
      FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, Data.Bind.EngExt, Fmx.Bind.DBEngExt,
      System.Rtti, System.Bindings.Outputs, Fmx.Bind.Editors, Data.Bind.Components, FMX.Objects;

    type
      TForm1 = class(TForm)
        TrackBar1: TTrackBar;
        Text1: TText;
        Button1: TButton;
        BindingsList1: TBindingsList;
        LinkControlToPropertyText: TLinkControlToProperty;
        procedure Button1Click(Sender: TObject);
      private
      public
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.fmx}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      TrackBar1.Value := 11;
      // bad workaround:
      // Text1.Text := Format('%n',[TrackBar1.Value]);
    end;

    end.

По данным Unit1.FMX:

    object Form1: TForm1
      Left = 0
      Top = 0
      Caption = 'Form1'
      ClientHeight = 480
      ClientWidth = 640
      FormFactor.Width = 320
      FormFactor.Height = 480
      FormFactor.Devices = [Desktop, iPhone, iPad]
      DesignerMobile = False
      DesignerWidth = 0
      DesignerHeight = 0
      DesignerDeviceName = ''
      DesignerOrientation = 0
      DesignerOSVersion = ''
      object TrackBar1: TTrackBar
        Frequency = 1.000000000000000000
        Height = 20.000000000000000000
        Orientation = Horizontal
        Position.X = 32.000000000000000000
        Position.Y = 64.000000000000000000
        TabOrder = 1
        Width = 100.000000000000000000
      end
      object Text1: TText
        Height = 25.000000000000000000
        Position.X = 152.000000000000000000
        Position.Y = 64.000000000000000000
        Width = 137.000000000000000000
      end
      object Button1: TButton
        Height = 22.000000000000000000
        Position.X = 32.000000000000000000
        Position.Y = 96.000000000000000000
        TabOrder = 3
        Text = 'Button1'
        Width = 80.000000000000000000
        OnClick = Button1Click
      end
      object BindingsList1: TBindingsList
        Methods = <>
        OutputConverters = <>
        Left = 20
        Top = 5
        object LinkControlToPropertyText: TLinkControlToProperty
          Category = 'Schnelle Bindungen'
          Control = TrackBar1
          Track = False
          Component = Text1
          ComponentProperty = 'Text'
        end
      end
    end

1 ответ

Решение

К сожалению, из-за дизайна привязки не запускаются установщиком свойства Value, а взаимодействуют с GUI (щелчки мышью или нажатия клавиш).

Вы можете увидеть это, добавив OnAssigningValue обработчик событий для вашего TLinkControlToProperty привязки, а затем глядя на стек вызовов, когда он срабатывает.

Чтобы вручную запустить это вам нужно написать:

TBindings.Notify(TrackBar1, 'Value');

Для этого вы должны добавить System.Bindings.Helper для вашего использования.

Редактировать: кажется, что привязки, которые вы можете создать с помощью визуальных привязок, не работают с ручным уведомлением (насколько это согласованно...), и вы должны использовать другой подход:

TLinkObservers.ControlChanged(TrackBar1);      
Другие вопросы по тегам