AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Spring4d DI + LiveBinding

Ein Thema von brieker · begonnen am 1. Jul 2015 · letzter Beitrag vom 2. Jul 2015
Antwort Antwort
brieker

Registriert seit: 2. Jun 2015
11 Beiträge
 
Delphi XE7 Architect
 
#1

Spring4d DI + LiveBinding

  Alt 1. Jul 2015, 15:06
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Spring4d DI + LiveBinding

  Alt 1. Jul 2015, 15:20
In 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;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 1. Jul 2015 um 15:38 Uhr)
  Mit Zitat antworten Zitat
brieker

Registriert seit: 2. Jun 2015
11 Beiträge
 
Delphi XE7 Architect
 
#3

AW: Spring4d DI + LiveBinding

  Alt 2. Jul 2015, 07:50
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Spring4d DI + LiveBinding

  Alt 2. Jul 2015, 08:07
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
brieker

Registriert seit: 2. Jun 2015
11 Beiträge
 
Delphi XE7 Architect
 
#5

AW: Spring4d DI + LiveBinding

  Alt 2. Jul 2015, 08:50
Klingt auch nicht schlecht aber wo finde ich da ne Möglichkeit zum unterschieben.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Spring4d DI + LiveBinding

  Alt 2. Jul 2015, 09:36
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
brieker

Registriert seit: 2. Jun 2015
11 Beiträge
 
Delphi XE7 Architect
 
#7

AW: Spring4d DI + LiveBinding

  Alt 2. Jul 2015, 11:14
Danke funktioniert wunderbar.

Warum mir das SetDataSet bisher nie aufgefallen ist wundert mich aber schon.

MfG Ben
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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