2015-01-15 16 views
6

ScenarioCome fare una classe di modello osservabile in WPF

ricevo una classe del modello da un componente esterno o di una parte di codice in cui io non voglio alterare qualcosa. Mi piacerebbe associare questa classe a qualche interfaccia utente WPF. Vorrei anche aggiornare l'interfaccia utente se questo modello viene modificato.

Domanda

Ho davvero bisogno di scrivere una classe wrapper per tutto il tempo, che crea eventi PropertyChanged per ogni setter? Come potrei evitare di scrivere tutta questa codifica di indizio manualmente?

Quello che era iniziato come questo ...

public class User : IUser 
{ 
    public String Name { get; set; } 
    public bool CurrentlyLoggedIn { get; set; } 

    // ... 
} 

... sarà sempre gonfio in questo modo

public class UserObservableWrapper : IUser, INotifyPropertyChanged 
{ 
    public String Name 
    { 
     get 
     { 
      return this.innerUser.Name; 
     } 
     set 
     { 
      if (value == this.innerUser.Name) 
      { 
       return; 
      } 

      this.innerUser.Name = value; 
      this.OnPropertyChanged("Name"); 
     } 
    } 

    public bool CurrentlyLoggedIn 
    { 
     get 
     { 
      return innerUser.CurrentlyLoggedIn; 
     } 
     set 
     { 
      if (value.Equals(innerUser.CurrentlyLoggedIn)) 
      { 
       return; 
      } 
      innerUser.CurrentlyLoggedIn = value; 
      this.OnPropertyChanged("CurrentlyLoggedIn"); 
     } 
    } 

    private readonly IUser innerUser; 

    public UserObservableWrapper(IUser nonObservableUser) 
    { 
     this.innerUser = nonObservableUser; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = this.PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Ci deve essere un modo più intelligente di farlo !?

+0

Ho sentito parlare di persone che utilizzano tecniche di Aspect Oriented per iniettare tale funzionalità in codice. Acquista www.PostSharp.net. La pagina di destinazione menziona anche INotifyPropertChanged in particolare. – Crowcoder

+0

@Crowcoder http://www.postsharp.net/model/inotifypropertychanged questo sembra fantastico, ma richiede che sia in grado di modificare le classi del modello e, come specificato, provengono da un componente esterno. Sai se 'PostSharp' ha la capacità di farlo in fase di runtime? –

+0

@Moti Non sono molto esperto, quindi esita a fare qualcosa di più che dire "guarda fuori, può essere utile", ma vedo che fanno tessere a tempo pieno e tessere statiche run-time che suona come se non ci fosse bisogno per modificare il codice effettivo della libreria che si sta utilizzando. http://www.postsharp.net/aop.net/runtime-weaving – Crowcoder

risposta

3

Se non dovesse accadere molte volte nel tuo codice, ti consiglierei di fare il codice boilerplate.

Altrimenti, è possibile utilizzare questo cool piece of code da Ayende per generare una classe proxy che implementerebbe automaticamente INotifyPropertyChanged per l'utente (incluso il sollevamento di eventi). Uso sarebbe simile a questa:

IUser userProxy = DataBindingFactory.Create<User>(); 
Problemi correlati