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/)
-   -   Livebinding einer FMX TListView an TStrings (https://www.delphipraxis.net/185171-livebinding-einer-fmx-tlistview-tstrings.html)

QuickAndDirty 20. Mai 2015 10:01


Livebinding einer FMX TListView an TStrings
 
Hallo Es handelt sich um eine FMX Anwendung.
Wie binde ich die TListView and eine TStrings?
Ich möchte das die TListView.Items[Index].Text mit den TStrings.Strings[Index] verbunden sind.

Es geht mir darum auf diese Weise die View mit dem ViewModel zu verbinden.

Hab den Ansatz: TAdapterBind mit TDataGeneratorAdapter versucht, hab das aber nicht hinbekommen.
Welche Daten hätte ich da in den Generator angeben sollen?

Wie würdet ihr das machen?

Geht das überhaupt?

Popov 20. Mai 2015 10:35

AW: Livebinding einer TListView an TStrings
 
Es könnte daran liegen, dass es noch früh am morgen ist und ich noch nicht richtig wach bin, aber auch daran, dass ein altes Delphi haben, aber ich kenne kein
Delphi-Quellcode:
TListView.Items[Index].Text
.

Auch verstehe ich nicht wirklich was du mit ViewModel meinst. Vielleicht ist es noch zu früh am morgen.

Was aber geht ist TListView virtuell zu betreiben. Die Daten sind dann nicht mehr in den Items abgelegt, ob als Texte oder Objekte, sondern TListView wird nur noch für die Anzeige "mußbraucht". Die Daten selbst sind irgendwo anders abgelegt, z. B. TObjectList, aber TStrings sollte auch möglich sein.

Vorausgesetzt ich habe dein Problem richtig verstanden.

QuickAndDirty 20. Mai 2015 10:52

AW: Livebinding einer TListView an TStrings
 
Tlistview Es hat vermutlich keine Items[index] aber eben Items.

Ich fülle das im Moment per code.
Delphi-Quellcode:
type
  TView = class(TForm)
    ListView: TListView;
    ViewLayout: TLayout;
    BindingsList1: TBindingsList;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    fViewModel : TViewModel;
    Procedure Fill;
    constructor Create(AOwner: TComponent); override;
  end;
implementation
procedure TView.FormCreate(Sender: TObject);
begin
  Fill;
end;

Procedure TView.Fill;
var ListViewItem:TListViewItem;
i:integer;
Begin
  ListView.ClearItems;
  ListView.BeginUpdate;
  for i := 0 to fViewModel.sl.count-1 do
  Begin
    ListViewItem := ListView.Items.Add;
    ListViewItem.Text := fViewModel.sl[i]
    ListViewItem.Detail := 'untouched';
  End;
  ListView.EndUpdate;
End;

constructor TView.Create(AOwner: TComponent);
begin
  inherited;
  fViewModel := TViewModel.create;
end;
Ich möchte aber "Fill" nicht haben!
Wie bekomme ich das mit livebindings hin.
Habe DelphiXE 8 und es ist ein Firemonkey projekt.
Ich versuche das Model-View-Viewmodel Entwurfsmuster umzusetzen.

himitsu 20. Mai 2015 10:55

AW: Livebinding einer TListView an TStrings
 
@Popov: Eventuell geht es um FMX?

Die Komponenten im FMX haben alle eine total anderes Interface und sind leider nicht zur VCL ähnlich aufgebaut.

Popov 20. Mai 2015 11:22

AW: Livebinding einer TListView an TStrings
 
Zitat:

Zitat von himitsu (Beitrag 1302277)
@Popov: Eventuell geht es um FMX?

Habe es übersehen.

Unabhängig dessen, hier eine kleine Demo wie man Listen virtuell an ListView bindet. Vielleicht klappt das auch in FMX.
Delphi-Quellcode:
var
  sl: TStringList;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  NewColumn: TListColumn;

  dt: TDateTime;
begin
  sl := TStringList.Create;

  //StringList mit sinnlosen Daten füllen
  for i := 0 to 999 do
    sl.Add(FormatDateTime('dd.MM.yyyy hh:nn:ss.zzz', Now));

  //Columns erstellen
  NewColumn := ListView1.Columns.Add;
  NewColumn.Width := 100;
  NewColumn.Caption := 'Datum';
  NewColumn := ListView1.Columns.Add;
  NewColumn.Width := 100;
  NewColumn.Caption := 'Uhrzeit';

  //Dies und das
  ListView1.ViewStyle := vsReport;
  ListView1.Align := alClient;

  //Virtuelle Zuordnungen
  ListView1.OwnerData := True; //<<<<wichtig
  ListView1.Items.Count := sl.Count; //<<<<wichtig
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  sl.Free;
end;

procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
var
  s, Datum, Uhrzeit: string;
begin
  s := sl[Item.Index];
  Datum := Copy(s, 1, Pos(' ', s) - 1);
  Uhrzeit := Copy(s, Pos(' ', s) + 1, MaxInt);

  Item.Caption := Datum;
  Item.SubItems.Add(Uhrzeit);
end;

QuickAndDirty 20. Mai 2015 13:44

AW: Livebinding einer FMX TListView an TStrings
 
Sorry aber es geht mit wirklich um livebindings.
Mein FMXFormular soll so weit wie irgendmöglich eine codefreie struktur sein.

Wenn das mit den Livebindings nicht klappt kann ich auf MVVM verzichten und wieder MVP machen.

stahli 20. Mai 2015 14:00

AW: Livebinding einer FMX TListView an TStrings
 
Da Du in dem Thread nichts geschrieben hast (ob gelesen weiß ich ja nicht), will ich mal auf mein ssFramework verweisen (http://www.delphipraxis.net/173360-s...framework.html).
Ich arbeite da nicht mehr weiter dran, aber vielleicht geht das in Deine gewünschte Richtung?

Das Ziel war eine einfachste Bindung der GUI an die BL und eine Automatisierung der Datenklassen.

Falls Du zeit zum schmökern hast...

QuickAndDirty 20. Mai 2015 14:50

AW: Livebinding einer FMX TListView an TStrings
 
Danke Stahli

Aber gibt es im ganzen Forum niemandes der mal versucht hat etwas anderes als ein Clientdataset in einem FMX Formular mit livebinding zu verknüpfen?

Es muss doch jemand geben der mir sagen kann ob das Binden von TStrings überhaupt möglich ist.

Im Moment fühle ich mich einfach wie der Entdecker der Antarktis...alles leer keine Spuren im Schnee...
Das kann doch nicht sein.

Sir Rufo 20. Mai 2015 15:09

AW: Livebinding einer FMX TListView an TStrings
 
Nun die Frage ist, warum du überhaupt eine StringList da binden willst.

Eigentlich wird über das LB an ein ListControl eine Liste mit Objekten gebunden und eben keine StringList.

QuickAndDirty 20. Mai 2015 15:22

AW: Livebinding einer FMX TListView an TStrings
 
Zitat:

Zitat von Sir Rufo (Beitrag 1302335)
Nun die Frage ist, warum du überhaupt eine StringList da binden willst.

Eigentlich wird über das LB an ein ListControl eine Liste mit Objekten gebunden und eben keine StringList.

Währe also TObjectList<TMyFunObject> plus TAdapterBindSource plus TDatageneratorAdapter richtig?

Und das TStrings nicht gehen dürfen ist für dich offensichtlich?

himitsu 20. Mai 2015 15:25

AW: Livebinding einer FMX TListView an TStrings
 
Mußte man der BindingSource nicht eh ein TList<T> reingeben?
Da geht TString/TStringList natürlich nicht (TList<string> ist ja was Anderes)

Sir Rufo 20. Mai 2015 15:35

AW: Livebinding einer FMX TListView an TStrings
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1302339)
Zitat:

Zitat von Sir Rufo (Beitrag 1302335)
Nun die Frage ist, warum du überhaupt eine StringList da binden willst.

Eigentlich wird über das LB an ein ListControl eine Liste mit Objekten gebunden und eben keine StringList.

Währe also TObjectList<TMyFunObject> plus TBindadapterBindSource plus TDatageneratorAdapter richtig?

Und das TStrings nicht gehen dürfen ist für dich offensichtlich?

Für schnell gemacht kannst du ein
Delphi-Quellcode:
TPrototypeBindSource
auf die Form klatschen und im
Delphi-Quellcode:
TPrototypeBindSource.OnCreateAdapter
Delphi-Quellcode:
procedure TForm1.PrototypeBindSource1CreateAdapter( Sender: TObject; var ABindSourceAdapter: TBindSourceAdapter );
begin
  FItems := TObjectList<TListViewItemViewModel>.Create;
  ABindSourceAdapter := TListBindSourceAdapter<TListViewItemViewModel>.Create( Self, FItems, True );
end;
In dem
Delphi-Quellcode:
TPrototypeBindSource
kannst/musst du noch die Felder definieren, die dann auf die Objekt-Eigenschaften der Objekte in der Liste gemappt werden ...

Selbst wenn das mit der StringList gehen würde, würde ich das nicht nehmen wollen, denn dann müsste ich ja von dem String wieder auf den Kontext kommen.

QuickAndDirty 20. Mai 2015 15:53

AW: Livebinding einer FMX TListView an TStrings
 
OK, Ich versuche das mal.
Sind meine ersten MVVM, livebinding und FMX Gehversuche.

Werde Jubel posten wenn es klappt.

QuickAndDirty 21. Mai 2015 12:38

AW: Livebinding einer FMX TListView an TStrings
 
Was kann man machen, wenn das Binding erfolgt bevor die Quelle erzeugt wurde?
Ich möchte nicht das die View die DatenObjecte des ViewModells besitzt.

Zur Zeit erstelle ich in der View das ViewModel und im ViewModel das Model.

Sollte ich das lieber von "außen" erstellen und verdrahten?


Ich habe es jetzt wie folgt gelöst.
Delphi-Quellcode:
constructor TView.Create(AOwner: TComponent);
begin
  fViewModel := TViewModel.create;
  inherited;
end;
Müsste sicher sein da das ViewModel ja eh nichts vom View weiß.

UND wenn das ok ist dann

HEUREKA. Das Livebinding klappt.

Natürlich bleibt ein Wehrmutstropfen:
An sich sollte ich ja im ViewModel keine Rücksicht nehmen müssen was für typen FMX binden kann und welche nicht. Schließlich möchte ich das ViewModel im zweifel an ein Audio basiertes View koppeln können usw. da sollte die art der View dem ViewModel doch eigentlich egal sein. So muss ich Rücksicht nehmen auf die Komponenten die auf der View liegen ob wohl sie im ViewModel offiziell gar nicht bekannt sind...
Kann auch sein das ich die Idee von MVVM falsch verstehe. Ich dachte hier ginge die Entkopplung wesentlich weiter als bei MVP...

Sir Rufo 21. Mai 2015 13:25

AW: Livebinding einer FMX TListView an TStrings
 
Beim MVVM gibt es View-First und ViewModel-First.

Da muss man sich entscheiden, welchen Ansatz man möchte.

Beim ViewModel-First braucht die View eine Kontext-Eigenschaft, wo man der View dann das ViewModel übergeben kann.

Und du brauchst auch keine Rücksicht auf die FMX-Typen nehmen, denn du kannst beim LB auch Konverter registrieren. Dann hat man z.B. einen TStream_to_TBitmap-Konverter

QuickAndDirty 21. Mai 2015 15:15

AW: Livebinding einer FMX TListView an TStrings
 
Da meine View eine ViewModel Eigenschaft hat verfolge ich einen ViewModel first Ansatz?

Wer erzeugt denn dann wen?

Ich hatte das aus diesem Video von nick hodges, dem hab ich entnommen:
View erzeugt und besitzt ViewModel erzeugt und besitzt Model.
Und keiner kennt seinen Erzeuger.

Ist das soweit richtig?
Wie machst du es ?

Sir Rufo 21. Mai 2015 21:14

AW: Livebinding einer FMX TListView an TStrings
 
View-First: Die View erzeugt das ViewModel selber (erst die View und dann das ViewModel)
ViewModel-First: Das ViewModel wird erzeugt und dann der passenden View übergeben (die wird erzeugt oder wiederverwendet)

Das Video von Nick zeigt MVVMchen-Klein - das kann man nicht wirklich für voll nehmen.

Wenn du was zu MVVM sehen möchtest, dann musst du dich mal in Richtung WPF umschauen, dort gibt es jede Menge, denn dort ist das eigentlich Pflichtprogramm.

QuickAndDirty 22. Mai 2015 08:39

AW: Livebinding einer FMX TListView an TStrings
 
Ich hab mich dazu gestern schlau gemacht...

Im Prinnzip ist es so das MVVM in WPF gut funktioniert wenn man nur eine View und nur ein ViewModel hat...
Alle haben probleme eine navigation über mehrere Views damit umzusetzen und entwickeln dazu diverse krücken.


Für ViewModel First brauche ich eine Entität die von außen View und ViewModel verheiratet.
Beim Navigieren über mehrere Views hat man aber immer noch das selbe problem.

Ich denke ich versuche diesen Ansatz dazu
http://dotneteers.net/blogs/vbandi/a...-approach.aspx
Der arbeitet mit Namenskonventionen zur Verknüpfung des ViewModels mit der View in der "falschen" Richtung...man könnte wohl auch interfaces benutzen . Und einen Globalen Kontext. Quasi C[MVVM]

Für Delphi gibt es kein MVVM mit ViewModel First oder mit View First der by the book verwendbar ist.
Und sogar in WPF fehlt die lehrbuchgerechte Umsetzung/Umsetbarkeit dieser beiden Ansätze von MVVM mit mehreren Views.

Warum gibt es das nicht?

mkinzler 22. Mai 2015 08:54

AW: Livebinding einer FMX TListView an TStrings
 
http://delphisorcery.blogspot.de/201...er-dsharp.html

QuickAndDirty 22. Mai 2015 09:54

AW: Livebinding einer FMX TListView an TStrings
 
Ja das ist gut, MKinzler.
Ich versuche es nur eben möglichst mit Bordmitteln hinzubekommen.

Wozu hat Delphi Bindings wenn es keine vernünftige Umsetzbarkeit für MVVM mit mehreren Views gibt?
Eigentlich müsste doch all das Teil des FMX Frameworks sein.
Ich hab Delphi XE 8 vorliegen... vielleicht haben die da noch einen Schatz vergraben den es zu heben gilt ?

stahli 22. Mai 2015 14:17

AW: Livebinding einer FMX TListView an TStrings
 
Info am Rande: Bei Video2Brain ist für Mai ein neues Video zu "WPF-Anwendungen mit MVVM und Prism" angekündigt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 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-2025 by Thomas Breitkreuz