Я пытаюсь создать тестовый объект, который имеет свойство строки, видимое для визуальной формы привязки. Компонент зарегистрирован с соответствующими свойствами. Использование 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.
Спасибо, что имеет свойство Foo, видимое без необходимости галочки. Теперь это тот, который действительно меня смущает. Почему я не могу привязать свойство Foo к свойству текста TEdit. Строка <-> Строка кажется наиболее логичной. – Yandros
Как выглядит ваша настройка LiveBinding в вашем проекте? Используете ли вы мастер LiveBinding или источник данных, например 'TPrototypeBindSource', или что вы на самом деле делаете? Можете ли вы привязать другие свойства компонента к свойству 'TEdit.Text'? Я не использую LiveBindings или FireMonkey, поэтому я не знаю, насколько хорошо они работают вместе. –
Спасибо за помощь кстати. Я использую мастер привязки, его простую форму с тедитом и TmyLBObj. Интересно, что я могу на самом деле заставить связать мастера с Tedit.text -> TmyLBObject.Foo, но не наоборот. Таким образом, привязка является однонаправленной и действительна только для свойства Foo, а не из нее. Все усердно, возможно, я должен сделать привязку в коде во время выполнения. это ранний набег на livebinding, переход от VCL к FMX !! – Yandros