![]() |
Spring4d DI + LiveBinding
Moin
Ich habe ein Program geschrieben bei dem eine MVVM Muster mit Hilfe von Spring4d Implementiert wird. Leider muste ich feststellen das das ViewModels erst nach dem Aufruf von onCreateAdapter der BindSource in das View injiziert wird. Deshalb kann das LiveBinding so nicht funktionieren. Habt ihr Vorschläge wie ich das Binding, anstatt in onCreateAdaptererst, nach dem injizieren machen kann ? Oder gibt es da eine elegantere Methode ? MfG Ben |
AW: Spring4d DI + LiveBinding
In
Delphi-Quellcode:
erst ABindSourceAdapter befüllen wenn dein VM assigned ist.
OnCreateAdapter
Um das erneut anzutriggern, musst du die AdapterBindSource.Active aus und wieder anschalten. Oder du pfeifst auf dieses dumme und verbuggte Event und schreibst einfach in deinen ViewModel setter:
Delphi-Quellcode:
AdapterBindSource1.Adapter := TObjectBindSourceAdapter<TMyViewModel>.Create(Self, fMyViewModel);
AdapterBindSource1.Active := True; |
AW: Spring4d DI + LiveBinding
Danke Stevie
Ich habe deinen Rat befolgt und habe den Event raus genommen und dafür den Adapter im Setter zusammen gebaut. Es klappt so weit das er jetzt die Daten aus dem ViewModel lesen kann aber irgend etwas muss ich vergessen haben den ins ViewModel schreiben macht er nicht. Die Property Setter werden nie angesprungen, die entsprechenden Getter schon. MfG Ben |
AW: Spring4d DI + LiveBinding
Man kann sich allerdings auch den Adapter erzeugen lassen ohne eine DataObject Instanz und im Setter der ViewModel Eigenschaft setzt man einfach das DataObject für den Adapter.
Schon baut man sich auch kein Speichergrab |
AW: Spring4d DI + LiveBinding
Klingt auch nicht schlecht aber wo finde ich da ne Möglichkeit zum unterschieben.
|
AW: Spring4d DI + LiveBinding
Zitat:
Delphi-Quellcode:
unit View.MainView;
interface uses ViewModel.MainViewModel, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.Bind.Components, Data.Bind.ObjectScope, Data.Bind.GenData, System.Rtti, System.Bindings.Outputs, Vcl.Bind.Editors, Data.Bind.EngExt, Vcl.Bind.DBEngExt, Vcl.StdCtrls, System.Actions, Vcl.ActnList; type TMainView = class( TForm ) ViewModelSource: TAdapterBindSource; ViewModelGenerator: TDataGeneratorAdapter; Edit1: TEdit; Edit2: TEdit; BindingsList1: TBindingsList; LinkControlToField1: TLinkControlToField; LinkControlToField2: TLinkControlToField; procedure ViewModelSourceCreateAdapter( Sender: TObject; var ABindSourceAdapter: TBindSourceAdapter ); private FViewModelAdapter: TObjectBindSourceAdapter<TMainViewModel>; function GetViewModel: TMainViewModel; procedure SetViewModel( const Value: TMainViewModel ); protected procedure Notification( AComponent: TComponent; Operation: TOperation ); override; public property ViewModel: TMainViewModel read GetViewModel write SetViewModel; end; var MainView: TMainView; implementation {$R *.dfm} function TMainView.GetViewModel: TMainViewModel; begin Result := FViewModelAdapter.DataObject; end; procedure TMainView.Notification( AComponent: TComponent; Operation: TOperation ); begin inherited; if Operation = opRemove then begin if ViewModel = AComponent then ViewModel := nil; end; end; procedure TMainView.SetViewModel( const Value: TMainViewModel ); var LOldViewModel: TComponent; begin if FViewModelAdapter.DataObject <> Value then begin LOldViewModel := FViewModelAdapter.DataObject; if Assigned( LOldViewModel ) then LOldViewModel.RemoveFreeNotification( Self ); FViewModelAdapter.SetDataObject( Value, False ); if Assigned( Value ) then Value.FreeNotification( Self ); FViewModelAdapter.Active := True; end; end; procedure TMainView.ViewModelSourceCreateAdapter( Sender: TObject; var ABindSourceAdapter: TBindSourceAdapter ); begin FViewModelAdapter := TObjectBindSourceAdapter<TMainViewModel>.Create( Self ); ABindSourceAdapter := FViewModelAdapter; ABindSourceAdapter.AutoEdit := True; ABindSourceAdapter.AutoPost := True; end; end. |
AW: Spring4d DI + LiveBinding
Danke funktioniert wunderbar.
Warum mir das SetDataSet bisher nie aufgefallen ist wundert mich aber schon.:roll: MfG Ben |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz