我正在使用MVVM,在我的一个虚拟机中,我有一个IsEditable
属性(它们都来自基类),一系列按钮使用它来确定它们的命令是否可以触发。 / p>
此虚拟机还有一个子虚拟机,我需要将此IsEditable
属性回显到该虚拟机,目前我正在覆盖我的OnPropertyChanged
方法,以检查正在刷新的属性是否为{{1} }。
我有一个唠叨,告诉我这不是一个很好的做法,如果将来重命名这个.Equals("IsEditable")
,那么这个功能将会默默地破坏。有没有更好的方法来执行此操作,或者能够将属性名称与反射一起使用,例如:
IsEditable
答案 0 :(得分:3)
您可能会使用与人们用来实现INotifyPropertyChanged的表达式相同的技巧。 Eric De Carufel blogged about this
如果您使用相同的技术,您可以将代码编写为:
if (IsPropertyName(() => this.IsEditable, propertyRefreshName))
{ ... }
这只需要实现一个函数来检查属性名称,但是让你以不使用硬编码字符串的方式进行。
答案 1 :(得分:1)
尝试使用扩展方法从对象中获取属性名称
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;
}
}
然后在你的OnPropertyChanged添加
if(propertyRefreshName == this.PropertyName(x => x.IsEditable))
SubVM.IsEditable = IsEditable;
答案 2 :(得分:0)
我同意statenjason。
除非我弄错了,根据我自己的经验,我了解到表达式树的主体并不总是一个MemberExpression(它实际上可以是任何东西)所以需要更多的代码。
请参阅FluentNHibernate项目中以下代码中的 GetMemberExpression 方法: