Linq表达式帮助-INotifyPropertyChanged
我正在阅读最新的Prism 4 drop的源代码,并对解决这个问题感兴趣。ViewModels有一个基类,它实现INotifyPropertyChanged和INotifyDataErrorInfo,并提供一些重构友好的更改通知Linq表达式帮助-INotifyPropertyChanged,linq,data-binding,mvvm,Linq,Data Binding,Mvvm,我正在阅读最新的Prism 4 drop的源代码,并对解决这个问题感兴趣。ViewModels有一个基类,它实现INotifyPropertyChanged和INotifyDataErrorInfo,并提供一些重构友好的更改通知 protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion) { var propertyName = ExtractPrope
protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion)
{
var propertyName = ExtractPropertyName(propertyExpresssion);
this.RaisePropertyChanged(propertyName);
}
private string ExtractPropertyName<T>(Expression<Func<T>> propertyExpresssion)
{
if (propertyExpresssion == null)
{
throw new ArgumentNullException("propertyExpression");
}
var memberExpression = propertyExpresssion.Body as MemberExpression;
if (memberExpression == null)
{
throw new ArgumentException("The expression is not a member access expression.", "propertyExpression");
}
var property = memberExpression.Member as PropertyInfo;
if (property == null)
{
throw new ArgumentException("The member access expression does not access property.","propertyExpression");
}
if (!property.DeclaringType.IsAssignableFrom(this.GetType()))
{
throw new ArgumentException("The referenced property belongs to a different type.", "propertyExpression");
}
var getMethod = property.GetGetMethod(true);
if (getMethod == null)
{
// this shouldn't happen - the expression would reject the property before reaching this far
throw new ArgumentException("The referenced property does not have a get method.", "propertyExpression");
}
if (getMethod.IsStatic)
{
throw new ArgumentException("The referenced property is a static property.", "propertyExpression");
}
return memberExpression.Member.Name;
}
我的问题是。将属性名数组传递给重载方法(RaisePropertyChanged)并将最后一位代码从4行压缩为1,需要做什么
谢谢,,
斯蒂芬:你考虑过改变一下吗
protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion)
{
var propertyName = ExtractPropertyName(propertyExpresssion);
this.RaisePropertyChanged(propertyName);
}
也许有人认为这是一个糟糕的做法,但至少要做到这一点。
祝你好运。你是否考虑过改变:
protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion)
{
var propertyName = ExtractPropertyName(propertyExpresssion);
this.RaisePropertyChanged(propertyName);
}
也许有人认为这是一个糟糕的做法,但至少要做到这一点。
祝你好运。我无法编译此文件。受保护的void RaisePropertyChanged(params Expression[]propertyExpression){foreach(propertyExpression.Select中的var propertyName(ExtractPropertyName)){this.RaisePropertyChanged(propertyName);}}方法'System.Linq.Enumerable.Select'的类型参数(System.Collections.Generic.IEnumerable,System.Func)'无法从用法中推断。请尝试显式指定类型参数。在我的试错测试期间,这对我有效的唯一方法是,如果您足够幸运,能够为传递给RaisePropertyChanged方法的所有属性提供相同的数据类型。在上面的示例中,您传递了一个字符串和2ts和我非常怀疑这是否有效,或者我应该说我仍然无法让它一字不差地工作。为了确保每个人都在同一页上,可能从其他评论中推断出一些东西,我需要编写代码,但我没有找到。我只是在尝试摸索这些东西,这远远超出了我的心智能力。我无法让这些东西消失compile.protected void RaisePropertyChanged(参数表达式[]PropertyExpression){foreach(PropertyExpression.Select(ExtractPropertyName)){this.RaisePropertyChanged(propertyName);}}}方法'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)的类型参数'无法从用法中推断。请尝试显式指定类型参数。在我的试错测试期间,这对我有效的唯一方法是,如果您足够幸运,能够为传递给RaisePropertyChanged方法的所有属性提供相同的数据类型。在上面的示例中,您传递了一个字符串和2ts和我非常怀疑这是否有效,或者我应该说我仍然无法让它一字不差地工作。为了确保每个人都在同一页上,可能从其他评论中推断出一些东西,我需要编写代码,但我遗漏了。我只是在尝试摸索这些东西,这远远超出了我的心智能力。作为旁注,就个人而言,我不同意在setter之外的属性上提升已更改的属性。我认为上面的代码实际上应该只设置有问题的属性。作为旁注,就个人而言,我不同意在setter之外的属性上提升已更改的属性。我认为上面的代码实际上应该只设置属性这是个问题。
protected void RaisePropertyChanged<T>(params Expression<Func<T>>[] propertyExpresssion)
{
foreach (var propertyName in
propertyExpresssion.Select(ExtractPropertyName))
{
this.RaisePropertyChanged(propertyName);
}
}
private void RetrieveNewQuestionnaire()
{
//yada yada yada
this.RaisePropertyChanged(() => this.Name,
() => this.UnansweredQuestions,
() => this.TotalQuestions);
}