Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Spring4d DI + LiveBinding (https://www.delphipraxis.net/185720-spring4d-di-livebinding.html)

brieker 1. Jul 2015 15:06

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

Stevie 1. Jul 2015 15:20

AW: Spring4d DI + LiveBinding
 
In
Delphi-Quellcode:
OnCreateAdapter
erst ABindSourceAdapter befüllen wenn dein VM assigned ist.

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;

brieker 2. Jul 2015 07:50

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

Sir Rufo 2. Jul 2015 08:07

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

brieker 2. Jul 2015 08:50

AW: Spring4d DI + LiveBinding
 
Klingt auch nicht schlecht aber wo finde ich da ne Möglichkeit zum unterschieben.

Sir Rufo 2. Jul 2015 09:36

AW: Spring4d DI + LiveBinding
 
Zitat:

Zitat von brieker (Beitrag 1307435)
Klingt auch nicht schlecht aber wo finde ich da ne Möglichkeit zum unterschieben.

Nun da:
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.

brieker 2. Jul 2015 11:14

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 05:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz