2009-12-04 9 views
1

J'utilise MVVM et dans une de mes machines virtuelles j'ai une propriété IsEditable (enfin, ils le font tous à partir d'une classe de base) qui est utilisée par une série de boutons pour déterminer si leurs commandes peuvent Feu.Utilisation de Reflection pour obtenir le nom d'une variable

Cette machine virtuelle possède également une sous-machine virtuelle pour laquelle je dois renvoyer cette propriété IsEditable à, actuellement je remplace ma méthode OnPropertyChanged pour vérifier si la propriété en cours d'actualisation est .Equals("IsEditable").

J'ai un harcèlement qui me dit que ce n'est pas vraiment une bonne pratique, si ce IsEditable est renommé dans le futur, alors cette fonctionnalité va se briser silencieusement. Y at-il une meilleure façon de faire, ou pour être en mesure d'utiliser le nom de la propriété avec la réflexion, .: par exemple

if (propertyRefreshName.Equals(IsEditable.Name)) 
{ 
    // Echo down IsEditable change.... 
} 
+0

utilisant la réflexion dans le temps code critique est généralement pas une bonne idée car il peut être très lent. Il semble que vous allez l'exécuter dans le fil de l'interface utilisateur. Il se peut que le ralentissement ne soit pas perceptible au début, mais avec le temps, vous remarquerez peut-être que votre application commence à explorer sans raison évidente. Je recommanderais un mécanisme de notification comme le suggère Reed. – Dolphin

Répondre

3

Vous pouvez, potentiellement, utiliser la même astuce avec des expressions que les gens utilisent pour mettre en œuvre INotifyPropertyChanged. Eric De Carufel blogged about this.

Si vous utilisez la même technique, vous pouvez écrire votre code comme:

if (IsPropertyName(() => this.IsEditable, propertyRefreshName)) 
{ ... } 

Cela juste besoin mettre en œuvre une fonction pour vérifier le nom de la propriété, mais vous permettra de le faire d'une manière qui ne utiliser des chaînes codées en dur.

+0

Votre lien contient '_22' qui le casse. Devrait être http://blog.decarufel.net/2009/07/how-to-use-inotifypropertychanged-type.html – statenjason

+0

Hrm ... Les deux travaillent pour moi. Le _22 est la révision du jour après ... –

+0

Je reçois "Désolé, la page que vous recherchez dans le blog Eric De C# n'existe pas" lorsque vous y êtes. – statenjason

1

Essayez une méthode d'extension pour obtenir les noms de propriétés sur des objets

public static class ObjectExtensions 
{ 
    public static string PropertyName<T,TOut>(this T source, Expression<Func<T,TOut>> property) 
    { 
     var memberExpression = (MemberExpression) property.Body; 
     return memberExpression.Member.Name; 
    } 
} 

Ensuite, dans votre OnPropertyChanged ajouter

if(propertyRefreshName == this.PropertyName(x => x.IsEditable)) 
    SubVM.IsEditable = IsEditable; 
Questions connexes