2015-01-15 6 views
6

SzenarioWie eine Modellklasse beobachtbaren in WPF

ich eine Modellklasse von einer externen Komponente erhalten machen oder einem Code Teil, wo ich will nicht, etwas zu ändern. Ich möchte diese Klasse an einige WPF UI binden. Ich möchte auch die Benutzeroberfläche aktualisieren, wenn dieses Modell geändert wird.

Frage

Muss ich wirklich eine Wrapper-Klasse die ganze Zeit schreiben müssen, die Property Veranstaltungen für jeden Setter schafft? Wie kann ich verhindern, dass diese ganze Hinweiscodierung manuell geschrieben wird?

Was wie begann ...

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

    // ... 
} 

... wird immer wie so

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)); 
     } 
    } 
} 

Es aufgebläht werden muss, eine intelligentere Art und Weise zu tun, dass sein !?

+0

Ich habe von Leuten gehört, mit Hilfe von Techniken Aspect Oriented eine solche Funktionalität in Code zu injizieren. Zur Kasse www.PostSharp.net. Die Zielseite erwähnt sogar ausdrücklich INotifyPropertChanged. – Crowcoder

+0

@Crowcoder http://www.postsharp.net/model/inotifypropertyangeändert das sieht fantastisch aus, aber es erfordert, dass er in der Lage ist, die Modellklassen zu bearbeiten, und wie er spezifiziert hat, kommen sie von einer externen Komponente. Weißt du, ob 'PostSharp' dazu in der Lage ist, dies zur Laufzeit zu tun? –

+0

@Moti Ich bin nicht sehr kenntnisreich, also zögere ich, mehr zu tun als nur zu sagen "check this out, es kann nützlich sein", aber ich sehe, dass sie Load-time Weben und Run-time statische Weben, die klingt, als gäbe es keine Notwendigkeit Ändern Sie den tatsächlichen Code der Bibliothek, die Sie verwenden. http://www.postsharp.net/aop.net/runtime-weaving – Crowcoder

Antwort

3

Wenn es nicht oft in Ihrem Code passiert, würde ich Ihnen empfehlen, den Boilerplate-Code zu tun.

Andernfalls können Sie cool piece of code von Ayende verwenden, um eine Proxy-Klasse zu generieren, die automatisch INotifyPropertyChanged für Sie implementieren würde (einschließlich Ereigniserhöhung). Verbrauch würde wie folgt aussehen:

IUser userProxy = DataBindingFactory.Create<User>(); 
Verwandte Themen