我有一个CLR实例属性,一个指向实例属性的静态PropertyPath和一个直接使用静态PropertyPath的xaml绑定,如下所示:
注意:GetPropertyPath只是一个方法,它根据成员名称中给定的linq表达式返回属性路径。
public static PropertyPath MyPropertyPath = GetPropertyPath(p=> p.MyProperty);
private object _myProperty;
public object MyProperty
{
get{ return _myProperty;}
set
{
_myProperty = value;
OnPropertyChanged(MyPropertyPath.Path);
}
}
然后使用MyViewModel作为标准mvvm方式的datacontext,xaml绑定如下:
{Binding Path={x:Static myNamespace:MyViewModel.MyPropertyPath}}
这种方法具有很大的好处,因为代码不使用任何未作为构建的一部分进行检查的引用。如果在viewmodel代码中更改了某些内容,则xaml绑定会在构建时出错,如果它们不再正确的话。
我的问题是,是否有人意识到这种方法可能产生的负面影响?
答案 0 :(得分:0)
前段时间我们只测试了问题的第一部分。 OnPropertyChanged(string propertyName)
和OnPropertyChanged(Expression<Func<object>> expression)
之间的效果差异是什么?后者类似于您的GetPropertyPath()
方法,它比基于原始字符串的方法慢了约2.5倍(569 ms与1 000 000次迭代时的1464 ms相比)。这似乎不是代码清晰度的巨大代价,尽管在使用Expressions
时不应忽视内存影响。
我的一般建议是在非密集型计算中使用表达式,否则请避免使用它们。我从未在代码的这一特定部分发现瓶颈 - 总有一些东西明显变慢......
答案 1 :(得分:0)
我认为GetPropertyPath()的影响在这里是相当可以忽略不计的,因为我将结果保存在静态变量中,而不是像使用时那样重复调用 'OnPropertyChanged(表达式&gt;表达式)'直接。
然而,我对数据绑定的内部有点模糊,将x:Static属性路径直接提供给xaml提供任何性能改进?我使用x:static?
来降低性能