5

Sto scrivendo un'applicazione desktop in C# utilizzando lo schema MVVM con un modello Entity Framework. Io tendo ad usare DependencyProperties nella mia VM e sono giunto a (generalmente) preferisco questo sistema rispetto all'implementazione di INotifyPropertyChanged. Mi piacerebbe mantenere le cose coerenti. La mia VM accede alle Entities nel Modello e sono riuscito a mantenere le cose abbastanza separate - la View non ha conoscenza della VM tranne i nomi di binding e comando e il Model ha know knowgege della VM.Utilizzo di DependencyProperty su ViewModel con Entity Framework

Utilizzando INotifyPropertyChanged nella VM, sembra abbastanza facile da aggiornare le Entità del Modello:

public string Forename 
    { 
     get { return CurrentPerson.Forename; } 
     set 
     { 
      if (Forename != value) 
      { 
       CurrentPerson.Forename = value; 
       NotifyPropertyChanged("Forename"); 
      } 
     } 
    } 

... dove CurrentPerson è un oggetto persona auto-creato dal Entity Data Model. Non esiste quindi un campo privato creato appositamente per memorizzare il nome.

Con DependencyProperties, sembra che dovrei creare un DP, aggiungere la Proprietà predefinita, utilizzando GetValue e Setvalue e quindi utilizzare il PropertyChangedCallback per aggiornare l'entità CurrentPerson. Chiamare una richiamata in questa situazione sembra aggiungere un sovraccarico al fine di essere coerente con le altre mie VM.

La domanda è quindi se uno o l'altro di questi metodi è il modo in cui I dovrebbe fare fare le cose? In questo caso, dovrei usare DependencyProperty o INotifyPropertyChanged? Una cosa che dovrebbe essere sottolineata è che questo sarà potenzialmente un progetto su larga scala (con plugin e molti accessi al database da macchine diverse) e che tutto dovrebbe essere davvero riutilizzabile ei moduli come "disconnected", il più possibile .

+0

Che cosa è un vantaggio dell'utilizzo di proprietà di dipendenza in vista del modello? In altre parole, quale valore aggiuntivo apporta che "INotifyPropertyChanged" non offre. –

+0

Sto cercando una buona velocità e le belle funzionalità di rilegatura che accompagnano i DP. Tieni presente che sono vincolante per i DP con XAML nella mia vista. È probabile inoltre che vi siano frequenti variazioni del valore delle proprietà. Dai riferimenti che ho trovato in precedenza, per la velocità con il binding, le DP sono la strada da percorrere. C'è anche coerenza con il resto del mio design. Tuttavia, nulla di tutto ciò va bene se viene negato da tutti quei callback in corso con modifiche separate agli oggetti Entity. –

risposta

2

Si consiglia di utilizzare INotifyPropertyChanged anziché DependencyProperty. La ragione principale per cui mi allontano da DependencyProperty in ViewModels è perché DependencyProperty si trova in WindowsBase.dll. Questo ti lega un po 'troppo all'interfaccia utente di Windows (almeno IMHO).

L'utilizzo di INotifyPropertyChanged è molto più semplice da gestire poiché consente ai vari plug-in di implementarlo nel modo desiderato. Se si forzano le proprietà di dipendenza, tutti i modelmodelli devono ereditare da DependencyObject.

Vedere questo articolo per maggiori dettagli circa l'uso di INotifyPropertyChanged e DependencyProperty: http://kentb.blogspot.com/2009/03/view-models-pocos-versus.html

Un'altra risposta di supporto: https://stackoverflow.com/a/783154/27669

+0

Grazie. Penso che INotifyPropertyChanged sarà la strada da percorrere, anche se con le varie salvaguardie dell'uso di "Magic Strings" in INotifyPropertyChanged, trovo ancora più elegante il DP. Le due ragioni principali che sto arrivando a questo punto di vista sono: 1) Duplicazione dello stato con DP e 2) Il fatto che a volte ho bisogno di cambiare l'intero stato dell'oggetto, e posso semplicemente farlo con PropertyChanged (null). Grazie per la risposta e i riferimenti. –

+0

L'accoppiamento con l'interfaccia utente di Windows può essere un problema MAGGIORE. È stato corretto un progetto in cui erano state utilizzate le stesse DLL per un servizio Web, ma la Proprietà dipendenze ha insistito per eseguire il thread dell'interfaccia utente piuttosto complicato in un servizio Web multithread.Questa flessibilità architettonica (ovvero la mancanza di un accoppiamento stretto con la GUI di Windows nelle Entity Dlls) è molto più importante dell'eleganza per la GUI. – user1496062

Problemi correlati