Значение 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);