2010-12-31 4 views
1

Meine Frage entspricht eher einer bewährten Vorgehensweise bei der Verwendung von INotifyPropertyChanged.Verwenden von TypeDescriptor zum Suchen nach gültigem propertyName bei Verwendung von INotifyPropertyChanged

Ich habe eine Basisklasse erstellt, die INotifyPropertyChanged implementiert, mit der Absicht, dass diese Klasse in den meisten benutzerdefinierten Ansichtsmodell-Bindungsumständen verwendet wird.

Grundsätzlich habe ich eine DispatchPropertyChange-Methode, die den Namen (String) der Eigenschaft ändert. Das ist ziemlich einfach, aber die Saiten sind offensichtlich fehleranfällig.

Ich würde gerne überprüfen, dass die Eigenschaft vor dem Versand gültig ist, aber ich bin mir nicht sicher, ob dies ein guter Ansatz ist. Bisher sieht meine Hilfsfunktion so aus.

private void ValidateProperty(string prop) 
{ 
    if(TypeDescriptor.GetProperties(this)[prop] == null) 
    { 
     //throw error 
    } 
} 

Ich denke, diese Strategie könnte die Dinge verlangsamen. Hat jemand einen anderen Ansatz oder eine Methode zur Überprüfung, ob ein Eigenschaftenname gültig ist?

Antwort

2

Viele Implementierungen (normalerweise kleine Unterschiede) des Umgangs mit der lose typisierten Ausgabe von INotifyPropertyChanged.PropertyChanged existieren.

Teil von einem example ist unten; die sich mit Ihrem null Check ...

protected void RaiseChanged<TProperty>(Expression<Func<TProperty>> propertyExpresion) 
{ 
    var property = propertyExpresion.Body as MemberExpression; 
    if (property == null || !(property.Member is PropertyInfo) || 
     !IsPropertyOfThis(property)) 
    { 
     throw new ArgumentException(string.Format(
      CultureInfo.CurrentCulture, 
      "Expression must be of the form 'this.PropertyName'. Invalid expression '{0}'.", 
      propertyExpresion), "propertyBLOCKED EXPRESSION; 
    } 

    this.OnPropertyChanged(property.Member.Name); 
} 
+0

Das ist interessant ... ich nicht starke Typisierung – Nicholas

+0

angesehen hatte, was ist die Leistung, den PropertyExpression-Delegaten zur Laufzeit auseinanderzunehmen? Starkes Tippen ist immer nett, aber ist es langsamer als die 'TypeDescriptor.GetProperties'-Prüfung, die in einem Release-Build mit ConditionalAttribute für die ValidateProperty-Methode deaktiviert werden kann? –

+0

@David Ich habe es persönlich nie bewertet; Allerdings habe ich den starken Typisierungsansatz in zahlreichen Anwendungen verwendet und hatte nie ein Problem. Ich schätze, dass es aufgrund des typischen Fußabdrucks eines Modells/Betrachtungsmodells ziemlich vernachlässigbar ist –

Verwandte Themen