@Schokohase: du hattest recht, was Benachrichtigung seitens Viewmodel betrifft.
Das war aber nicht wirklich die Herausforderung. Das Problem war, dass die gebundene TComboBox.ItemIndex View-Eigenschaft im Viewmodel nie aktualisiert/benachrichtigt wurde. In DSharp MVVM konnte man mit "AddElementConvention<TCombobox>" die Binding Eigenschaften selbst erweitern. Da ich den Code von Grijjy MVVM aktuell noch nicht durchschaue habe ich brutal quick&dirty wie folgt die "Grijjy.Mvvm.Controls.Vcl.pas" angepasst:
Delphi-Quellcode:
procedure TComboBox.Change;
begin
if Assigned(FOnPropertyChanged) then
begin
FOnPropertyChanged.Invoke(Self, 'Text');
FOnPropertyChanged.Invoke(Self, 'ItemIndex'); // <--- hier erweitert
end;
if Assigned(FOnPropertyChangeTracking) then
begin
FOnPropertyChangeTracking.Invoke(Self, 'Text');
FOnPropertyChanged.Invoke(Self, 'ItemIndex'); // <--- hier erweitert
end;
SetSelectedItem( Items.Objects[ItemIndex]);
inherited;
end;
Das Viewmodel schaut dann so aus:
Delphi-Quellcode:
TViewModelDemo = class(TgoObservable)
private
//..
FSpezialItemIndex: Integer;
procedure setSpezialItemIndex(const Value: Integer);
//..
public
//..
property SpezialItemIndex: Integer read FSpezialItemIndex write setSpezialItemIndex;
end;
implementation
//..
procedure TViewModelDemo.setSpezialItemIndex(const Value: Integer);
begin
if FSpezialItemIndex = Value then exit;
FSpezialItemIndex := Value;
PropertyChanged('SpezialItemIndex');
end;
Nun die Frage an die Experten, so wie ich die Grijjy.Mvvm.Controls.Vcl.pas angepasst habe, ist es im Sinne des Erfinders oder sollte man eher an einer anderen Stelle ansetzen?
lg,
jus