Laden...

Greift duch INotifyPropertyChanged nicht die View auf die Daten zu & verletzt das MVVM-Prinzip?

Erstellt von Caveman vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.128 Views
Caveman Themenstarter:in
187 Beiträge seit 2009
vor 5 Jahren
Greift duch INotifyPropertyChanged nicht die View auf die Daten zu & verletzt das MVVM-Prinzip?

Hallo zusammen,

ich habe eine grundsätzliche Frage zu WPF Applikationen mit MVVM. Sinn der Sache ist ja die Trennung zwischen der View und dem Model über das ViewModel. Soweit ist alles klar.
Ich will mein Verständnisproblem anhand eines Beispiels versuchen zu erklären.
Angenommen ich habe eine ObservableCollection von der Klasse Personen und die Klasse Personen besitzt die Properties Vorname und Nachname. Die ObservableCollection binde ich an ein Datagrid.
Wenn ich nun in einem Datensatz z.B. den Vornamen ändern möchte, dann muss ich für die Aktualisierung der Anzeige im Datagrid in der Personenklasse INotifyPropertyChanged implementieren. Und genau da ist mein Problem. Damit greift doch die View direkt auf die Daten zu. Oder etwa nicht?
In der View steht ja in etwa


<DataGrid ItemsSource="{Binding Personen}" AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Vorname}" />
        <DataGridTextColumn Header="Name" Binding="{Binding Nachname}" />
    </DataGrid.Columns>
</DataGrid>
F
10.010 Beiträge seit 2004
vor 5 Jahren

Damit greift doch die View direkt auf die Daten zu. Oder etwa nicht?

Magie funktioniert halt nicht, irgendwo muss halt auf die Daten zugegriffen werden.

Aber der View weiß nicht wo die Daten herkommen, und das Viewmodel weiß nicht wer die Daten ändert.
Darum geht es, Testbarkeit der Businesslogik.

16.834 Beiträge seit 2008
vor 5 Jahren

MVVM trennt UI und Logik; nicht unbedingt bezogen auf Modelle.

INotifyPropertyChanged ist Teil der UI und nicht Teil der Logik; kommt also an das ViewModel aber nicht in das Model.

Caveman Themenstarter:in
187 Beiträge seit 2009
vor 5 Jahren

@FZelle: Heißt das jetzt, dass das okay und MVVM konform ist?
@Abt: Jetzt bin ich wieder genau so schlau wie vorher. Wenn ich das INotifyPropertyChanged nicht in das Model implementiere, dann aktualisiert die View nicht.

16.834 Beiträge seit 2008
vor 5 Jahren

Es gibt ja viele MVVM "Dialekte".
Deiner ähnelt ja eher dem Ansatz des traditionellen MVVM; wobei ich persönlich denke, dass der Weg über ReactiveUI derzeit die sauberste MVVM Darstellung ist.

@Abt: Jetzt bin ich wieder genau so schlau wie vorher. Wenn ich das INotifyPropertyChanged nicht in das Model implementiere, dann aktualisiert die View nicht.

Warum nicht?

Ich bin etwas raus aus WPF und MVVM; aber IIRC erfolgt die Aktualisierung entweder im Setter des ViewModels der Daten (hier Deine Collection von Personen) oder durch einen Command bzw. Execute.

Aber INotifyPropertyChanged mit im Business Model zu ziehen ist in meinen Augen eine gewisse Verletzung der Schichten; und IIRC eine Bad Practise in MVVM.

F
10.010 Beiträge seit 2004
vor 5 Jahren

@Caveman:
Alles was an die UI gebunden werden soll, muss INPC implementieren.
ABER deine Personenklasse darf natürlich nicht deine Datenklasse sein, sondern ein ViewModel dessen.