c# - 如何使 WPF 数据绑定(bind)重构安全?

标签 c# .net wpf data-binding

所以我正在完成我的第一个 WPF 项目,我很喜欢目前所看到的内容。学习曲线比我预期的要多,但是 WPF 非常酷。但是,我在数据绑定(bind)概念上遇到了一些困难。我的一个具体问题是如何使我的数据绑定(bind)声明重构安全?考虑这个例子。

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 重命名为其他名称会怎么样?数据绑定(bind)将无效,并且我不会收到编译错误,因为绑定(bind)仅通过文本声明。有没有办法让绑定(bind)更安全一点?

最佳答案

您可以使用 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 中除外......),重构应该可以正常工作

关于c# - 如何使 WPF 数据绑定(bind)重构安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1413127/

相关文章:

c# - 需要交换具体类时的依赖注入(inject) C#

.net - 使用 Powershell TOM 在 SSAS 表格中创建分区

c# - UI 未从单独 ViewModel 的命令调用的 ObservableCollection 进行更新

wpf - 如何将 StackPanel 绑定(bind)到我的 ViewModel?

c# - 在 Windows 应用商店应用程序开发中保存复杂用户数据的*正确*方法是什么?

C# Tcp 通信线程池与异步调用

c# - 在 C# 中使用 PropertyInfo 的奇怪问题

.net - DataGridComboBoxColumn 数据绑定(bind)

wpf - 在无边框 WPF 窗口上启用 Vista 玻璃效果

c# - 带有图像的 WPF Storyboard,在可见时启动板