Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DSharp Binding zeitweise deaktivieren? (https://www.delphipraxis.net/201114-dsharp-binding-zeitweise-deaktivieren.html)

jus 25. Jun 2019 00:23


DSharp Binding zeitweise deaktivieren?
 
Hallo,

ich setze die Binding Funktion von DSharp ein, um die View Komponente TreeViewPresenter an ein ViewModel zu binden.
Auf der Form/View Seite:
Delphi-Quellcode:
procedure TViewForm.FormCreate(Sender: TObject);
begin
//...
  ViewModel := TViewModel.Create;
  ViewModel.LoadItemsFromDatabase;
  binding := TBinding.Create(ViewModel, 'TreeViewPresenter1Items', TreeViewPresenter1, 'View.ItemsSource');
end;
In ViewModel.pas sieht es dann etwa so aus:
Delphi-Quellcode:

type
  TDataItem = Class
  private
    FValue1: Integer;
  public
  property Value1: Integer read FValue1 write FValue1;
  end;

  TViewModel = Class
  private
    FTreeViewPresenter1Items: IObjectList;
  public
    constructor Create;
    procedure LoadItemsFromDatabase;
  property TreeViewPresenter1Items: IObjectList read FTreeViewPresenter1Items;
  end;

implementation

procedure TViewModel.LoadItemsFromDatabase;
var
  Item: TDataItem;
  i: Integer;
begin
  FTreeViewPresenter1Items.Clear;
  // lade ca. 2000 Einträge aus einer Datenbanktabelle

  for i := 0 to 2000 do
  begin
    Item := TDataItem.Create;
    //Übertrage Zeile für Zeile die Einträge aus der Tabelle in die "FTreeViewPresenter1Items" Liste......
    FTreeViewPresenter1Items.Add(Item);
  end;
end;
Das Binding funktioniert einwandfrei. Doch das Problem beginnt damit, dass von Zeit zu Zeit die FTreeViewPresenter1Items Liste neu aus der Datenbank mit der Methode TViewModel.LoadItemsFromDatabase eingelesen werden muß. In meinem aktuell Fall sind es ca. 2000 Zeile aus einer Tabelle. Dann dauert es wesentlich länger als wenn das Binding nicht nicht wäre. Ohne Binding benötigt die for-Schleife von der Methode TViewModel.LoadItemsFromDatabase <1ms mit Binding ca. 7Sekunden.
Ich habe versucht in der View das Binding.Enabled während auf der Aktualisierung auf FALSE setzen, dies hat zwar leichte Verbesserung von ca.1-2 Sekunden eingespart. Kann man zeitweise das Binding komplett deaktiveren?
Was wäre die Best Practice in so einem Falle?

Lg,
jus

Stevie 25. Jun 2019 08:53

AW: DSharp Binding zeitweise deaktivieren?
 
Das Binding, was du erstellt hast, sorgt nur dafür, dass die IObjectList Instanz an den TVP gehangen wird - sonst nichts.
Dass das neu befüllen so lange dauert, liegt daran, dass der TVP auf jedes OnChanged reagiert (~2000 mal caRemoved beim .Clear und ~2000 mal caAdded beim .Add)

Bei solchen Aktionen bietet es sich an, entweder BeginUpdate/EndUpdate auf dem TVP aufzurufen, oder View.ItemsSource vorher ab- und nachher wieder anzuhängen.
Einen Mechanismus, wie man ihn von TDataSet kennt, indem man diesem sagen kann, dass sämtliche angebundenen UI Controls nicht auf Änderungen reagieren sollen, gibt es bei einer Liste nicht.

jus 25. Jun 2019 17:18

AW: DSharp Binding zeitweise deaktivieren?
 
Zitat:

Zitat von Stevie (Beitrag 1435279)
Das Binding, was du erstellt hast, sorgt nur dafür, dass die IObjectList Instanz an den TVP gehangen wird - sonst nichts.
Dass das neu befüllen so lange dauert, liegt daran, dass der TVP auf jedes OnChanged reagiert (~2000 mal caRemoved beim .Clear und ~2000 mal caAdded beim .Add)

Bei solchen Aktionen bietet es sich an, entweder BeginUpdate/EndUpdate auf dem TVP aufzurufen, oder View.ItemsSource vorher ab- und nachher wieder anzuhängen.
Einen Mechanismus, wie man ihn von TDataSet kennt, indem man diesem sagen kann, dass sämtliche angebundenen UI Controls nicht auf Änderungen reagieren sollen, gibt es bei einer Liste nicht.

Hallo Stefan, vielen Dank für die prompte Antwort. ehhm.... wie meinst du das mit abhängen? Oder wie macht man das Abhängen? :duck: Meinst du sowas wie binding.free? :oops:

lg,
jus

Stevie 25. Jun 2019 23:01

AW: DSharp Binding zeitweise deaktivieren?
 
Auf nil setzen...

jus 26. Jun 2019 13:40

AW: DSharp Binding zeitweise deaktivieren?
 
Ok, vielen Dank Stefan! Jetzt funktioniert es wesentlich schneller!

lg,
jus


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 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