2015-08-12 2 views
3

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

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

  • как я это показать в нем с видимостью класса по умолчанию
  • почему не 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. 

ответ

3

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

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

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

Tutorial: Creating LiveBindings-Enabled Components.

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

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

+0

Спасибо, что имеет свойство Foo, видимое без необходимости галочки. Теперь это тот, который действительно меня смущает. Почему я не могу привязать свойство Foo к свойству текста TEdit. Строка <-> Строка кажется наиболее логичной. – Yandros

+0

Как выглядит ваша настройка LiveBinding в вашем проекте? Используете ли вы мастер LiveBinding или источник данных, например 'TPrototypeBindSource', или что вы на самом деле делаете? Можете ли вы привязать другие свойства компонента к свойству 'TEdit.Text'? Я не использую LiveBindings или FireMonkey, поэтому я не знаю, насколько хорошо они работают вместе. –

+0

Спасибо за помощь кстати. Я использую мастер привязки, его простую форму с тедитом и TmyLBObj. Интересно, что я могу на самом деле заставить связать мастера с Tedit.text -> TmyLBObject.Foo, но не наоборот. Таким образом, привязка является однонаправленной и действительна только для свойства Foo, а не из нее. Все усердно, возможно, я должен сделать привязку в коде во время выполнения. это ранний набег на livebinding, переход от VCL к FMX !! – Yandros

 Смежные вопросы

  • Нет связанных вопросов^_^