如何使WPF数据绑定重构安全?

Bri*_*eon 7 .net c# data-binding wpf

所以我正在完成我的第一个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;
}
Run Code Online (Sandbox Code Playgroud)

那么如果我将数据对象上的FooProperty重命名为其他内容呢?数据绑定将无效,我不会收到编译错误,因为绑定是通过文本声明的.有没有办法让绑定更安全一点?

Tho*_*que 3

您可以使用 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");
    }
Run Code Online (Sandbox Code Playgroud)

你会这样使用它:

...
DisplayMember = new Binding(GetPropertyName((MyDataObject o) => o.FooProperty))
...
Run Code Online (Sandbox Code Playgroud)

好吧,这有点冗长......如果你想要更短的东西,你还可以创建一个辅助方法:

public Binding CreateBinding<TSource, TResult>(Expression<Func<TSource, TResult>> expression)
{
    return new Binding(GetPropertyName(expression))
}

...
DisplayMember = CreateBinding((MyDataObject o) => o.FooProperty)
...
Run Code Online (Sandbox Code Playgroud)

这样,如果您重命名该属性,重构应该可以正常工作(当然 XAML 中除外......)