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