因此,我正在完成我的第一个 WPF 项目,并且我很喜欢到目前为止所看到的内容。学习曲线比我预期的要多,但尽管如此,WPF 还是很酷的。然而,我在数据绑定概念上遇到了一些困难。我的一个具体问题是如何使我的数据绑定声明重构安全?考虑这个例子。
public class MyDataObject
{
public string FooProperty { get; set; }
}
void Bind()
{
var gridView = myListView.View as GridView;
gridView.Columns.Clear();
gridView.Columns.Add(
new GridViewColumn()
{
Header = "FooHeader",
DisplayMember = new Binding("FooProperty")
}
);
List<MyDataObject> source = GetData();
myListView.ItemsSource = source;
}
那么,如果我将数据对象上的 FooProperty 重命名为其他名称会怎样?数据绑定将无效,并且我不会收到编译错误,因为绑定仅通过文本声明。有没有办法让绑定更加重构安全?
您可以使用 lambda 表达式来表达属性名称,而不是直接使用名称:
protected static string GetPropertyName<TSource, TResult>(Expression<Func<TSource, TResult>> expression)
{
if (expression.NodeType == ExpressionType.Lambda && expression.Body.NodeType == ExpressionType.MemberAccess)
{
PropertyInfo prop = (expression.Body as MemberExpression).Member as PropertyInfo;
if (prop != null)
{
return prop.Name;
}
}
throw new ArgumentException("expression", "Not a property expression");
}
你会这样使用它:
...
DisplayMember = new Binding(GetPropertyName((MyDataObject o) => o.FooProperty))
...
好吧,这有点冗长......如果你想要更短的东西,你还可以创建一个辅助方法:
public Binding CreateBinding<TSource, TResult>(Expression<Func<TSource, TResult>> expression)
{
return new Binding(GetPropertyName(expression))
}
...
DisplayMember = CreateBinding((MyDataObject o) => o.FooProperty)
...
这样,如果您重命名属性,重构应该可以正常工作(当然 XAML 中除外......)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)