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 !?
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
@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? –
@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