2011-10-19 5 views
11

Ho funzionalità di base incapsulato in ViewModelBaseCome posso iscrivermi all'evento PropertyChanged nel mio ViewModel?

Ora voglio vedere quando l'evento PropertyChanged è stato generato da ViewModelBase e agire su di esso. Ad esempio, quando una proprietà è stata modificata su ViewModelBase, desidero modificare la proprietà sul mio ViewModel

Come ottengo ciò?

public class MaintainGroupViewModel : BaseViewModel<MEMGroup> 
    { 


public abstract class BaseViewModel<T> : NotificationObject, INavigationAware 
     where T : Entity 
    { 
+1

Il tuo 'NotificationObject' implementa l'interfaccia' INotifyPropertyChanged'? Se è così, allora è l'abbonamento di base all'evento. Altrimenti dovresti implementare 'INotifyPropertyChanged'. –

risposta

9

Sono preoccupato che si sta effettivamente facendo un ' associazione manuale '(non valida) per una proprietà in una classe derivata a un valore nella classe base (anche non valida). L'intero punto dell'utilizzo dell'ereditarietà è che la classe derivata può accedere alle cose nella classe base. Utilizzare un modificatore protected per indicare che le cose dovrebbero essere accessibili solo alle classi derivate.

Vorrei suggerire questo metodo (potenzialmente) più corretto:

Classe base:

protected virtual void OnMyValueChanged() { } 

classe derivata:

protected override void OnMyValueChanged() { /* respond here */ } 

Davvero, la sottoscrizione di un evento nella classe base di la stessa classe che stai scrivendo sembra incredibilmente arretrata: che senso ha usare l'ereditarietà sulla composizione se ti componi intorno a te stesso? Stai letteralmente chiedendo a un oggetto di dire a se stesso quando succede qualcosa. Una chiamata al metodo è ciò che dovresti usare per quello.

In termini di "quando una proprietà è stata modificata su ViewModelBase - Voglio modificare la proprietà sul mio ViewModel", ... sono lo stesso oggetto!

+0

Sì, odora :) Il mio scenario è così ... Ho delle funzionalità di base ma in questo caso specifico voglio riorganizzare alcuni dei dati sul mio ViewModel quando alcuni dati di base sono cambiati.la classe base mantiene l'entità dei dati principali (diciamo il cliente) e voglio aggiornarmi più IU quando cambia il cliente – katit

+0

Suggerirei comunque di usare metodi piuttosto che eventi e usare la composizione sull'ereditarietà se necessario: creare un nuovo oggetto che contiene il ViewModel di base, altrimenti tutti avranno ancora accesso alla funzionalità 'base' della base ViewModel, che in realtà sembra che tu stia modificando, quindi una classe derivata non si adatta –

+0

Forse il metodo è un modo per andare.Un altro esempio.La classe base mantiene lo "stato" della mia voce di dati modulo. Come NUOVO, MODIFICA, AGGIUNGI. Il gruppo di UI si lega a questo stato. Nella mia VM, voglio sapere anche questo cambiamento di stato. Posso creare il metodo OnStateChange o posso iscrivermi a PropertyChanged. Vedi la necessità di ricomporre o semplicemente creare metodi? I metodi potrebbero essere "più puliti" per guardare a – katit

2

Il modo diretto di sottoscrivere modifiche alle proprietà sta usando INotifyPropertyChanged se il BaseViewModel attua:

PropertyChanged += (obj, args) => 
    { System.Console.WriteLine("Property " + args.PropertyName + " changed"); } 

Se così non fosse, allora deve essere un DependencyObject, e le proprietà devono be DependencyProperties (che è probabilmente un modo più complicato).

This article descrive come sottoscrivere le modifiche DependencyProperty.

44

Di solito io uso registrarsi per l'evento PropertyChanged nel costruttore della classe

public MyViewModel() 
{ 
    this.PropertyChanged += MyViewModel_PropertyChanged; 
} 

e il mio gestore di eventi PropertyChanged assomiglia a questo:

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    switch (e.PropertyName) 
    { 
     case "SomeProperty": 
      // Do something 
      break; 
    } 
} 
+0

Esiste comunque la possibilità di sbarazzarsi delle "corde magiche" durante la manipolazione. (Non sto utilizzando C# 6) – Marshal

+0

@Marshal Non sono sicuro, che dire [questo post di Josh Smith] (https://joshsmithonwpf.wordpress.com/2009/07/11/one-way-to-to evitare di-disordinato-PropertyChanged-gestione degli eventi /)? – Rachel

+0

Penso che sia una buona soluzione e abbastanza testabile. Grazie per aver indicato l'articolo. – Marshal