![]() |
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:
In ViewModel.pas sieht es dann etwa so aus:
procedure TViewForm.FormCreate(Sender: TObject);
begin //... ViewModel := TViewModel.Create; ViewModel.LoadItemsFromDatabase; binding := TBinding.Create(ViewModel, 'TreeViewPresenter1Items', TreeViewPresenter1, 'View.ItemsSource'); end;
Delphi-Quellcode:
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.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; 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 |
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. |
AW: DSharp Binding zeitweise deaktivieren?
Zitat:
lg, jus |
AW: DSharp Binding zeitweise deaktivieren?
Auf nil setzen...
|
AW: DSharp Binding zeitweise deaktivieren?
Ok, vielen Dank Stefan! Jetzt funktioniert es wesentlich schneller!
lg, jus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 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