Delphi: сделать компонент видимым для живого связывания

Я пытался создать тестовый объект со строковым свойством, видимым для формы визуальной привязки. Компонент регистрируется с соответствующими свойствами. Использование XE8 и Firemonkey.

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

  • как мне показать его с видимостью класса по умолчанию
  • почему строка Foo не привязывается к текстовому свойству

Файлы справки немного тонкие по этому поводу. Я предполагаю, что мне не хватает чего-то действительно простого здесь.

Код объекта ниже.

Спасибо.

unit TestOBj;

interface

uses
  System.Classes, System.SysUtils, System.StrUtils, Data.Bind.Components;

Type

  TMyLBObject = Class (TComponent)
  private
    fFooString:String;
    FReadOnly: Boolean;
    procedure SetReadOnly(const Value: Boolean);
    procedure SetFooString(const Value: String);
  protected
    function CanObserve(const ID: Integer): Boolean; override;                       
    procedure ObserverAdded(const ID: Integer; const Observer: IObserver); override;
    procedure ObserverToggle(const AObserver: IObserver; const Value: Boolean);
  published
    property Foo:String read FFooString write SetFooString;
    property ReadOnly:Boolean read FReadOnly write SetReadOnly;
  End;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Test', [TMyLBObject]);
end;

{ TMyLBObject }

function TMyLBObject.CanObserve(const ID: Integer): Boolean;
begin
  Result := False;
  if ID = TObserverMapping.EditLinkID then
    Result := True;
  if ID = TObserverMapping.ControlValueID then
    Result := True;
end;

procedure TMyLBObject.ObserverAdded(const ID: Integer;
  const Observer: IObserver);
begin
  if ID = TObserverMapping.EditLinkID then
    Observer.OnObserverToggle := ObserverToggle;
end;


procedure TMyLBObject.ObserverToggle(const AObserver: IObserver;
  const Value: Boolean);
var
  LEditLinkObserver: IEditLinkObserver;
  LSaveReadOnly: Boolean;
begin
  if Supports(AObserver, IEditLinkObserver, LEditLinkObserver) then
  begin
    if Value then
    begin
      LSaveReadOnly := ReadOnly;
      if LEditLinkObserver.IsReadOnly then
        ReadOnly := True;
      FReadOnly := LSaveReadOnly;
    end
    else
      if not (csDestroying in ComponentState) then
        ReadOnly := FReadOnly;
  end;
end;


procedure TMyLBObject.SetFooString(const Value: String);
begin
  FFooString := Value;
end;

procedure TMyLBObject.SetReadOnly(const Value: Boolean);
begin
  FReadOnly := Value;
end;


initialization
  RegisterClass(TMyLBObject);
  RegisterObservableMember(TArray<TClass>.Create(TMyLBObject), 'Foo', 'FMX');
finalization
  UnRegisterObservableMember(TArray<TClass>.Create(TMyLBObject));
end.

person Yandros    schedule 12.08.2015    source источник


Ответы (1)


Ваш компонент TMyLBObject не имеет атрибута [ObservableMember('Foo')].

type
  [ObservableMember('Foo')] // <-- add this
  TMyLBObject = Class (TComponent)
    ...
  published
    property Foo:String read FFooString write SetFooString;
    ...
  End;

См. пример в документации:

Учебное пособие. Создание компонентов с поддержкой LiveBindings.

Что включает в себя это примечание:

Атрибут ObservableMember будет использоваться компонентами LiveBindings для создания выражений. RegisterObserverableMember() будет использоваться во время разработки для информирования дизайнера LiveBindings.

person Remy Lebeau    schedule 12.08.2015
comment
Спасибо, что свойство Foo видно без необходимости идти и ставить галочку. Теперь это то, что меня действительно смутило: почему я не могу привязать свойство Foo к текстовому свойству TEdit. Строка ‹-› Строка кажется наиболее логичной. - person Yandros; 13.08.2015
comment
Как выглядит ваша установка LiveBinding в вашем проекте? Используете ли вы мастер LiveBinding или источник данных, такой как TPrototypeBindSource, или что вы на самом деле делаете? Можно ли привязать другие свойства компонента к свойству TEdit.Text? Я не использую LiveBindings или FireMonkey, поэтому не знаю, насколько хорошо они работают вместе. - person Remy Lebeau; 13.08.2015
comment
Спасибо за помощь кстати. Я использую мастер привязки, это простая форма с tedit и TmyLBObj. Интересно, что я действительно могу заставить мастер привязки выполнять привязку из Tedit.text -> TmyLBObject.Foo, но не наоборот. Таким образом, привязка является однонаправленной и действительна только для свойства Foo, а не от него. Все усложняется, может быть, мне следует сделать привязку в коде во время выполнения. это ранний набег на livebinding, переход от VCL к FMX!! - person Yandros; 13.08.2015
comment
Если вы создаете LiveBinding для компонента TMyLBObject, вы можете связать свойство TEdit.Text для обновления свойства TMyLBObject.Foo. Вы создали LiveBinding для компонента TEdit, чтобы связать его свойство Text для обновления с TLBObject.Foo? Опять же, какие ТОЧНЫЕ шаги вы предпринимаете для настройки LiveBinding в своем приложении после того, как компоненты будут удалены в вашей форме? - person Remy Lebeau; 13.08.2015
comment
В дизайнере livebinding щелкните левой кнопкой мыши на свойстве MyObj Foo и перетащите его к свойству Tedit Text, он создаст однонаправленную ссылку из текста -> Foo. Мне нужно, чтобы он был двунаправленным. Нашел старый блог Дэмиена Бутсмы, но он использует TBindScope (который больше не является объектом времени разработки). - person Yandros; 13.08.2015