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

2023-11-21

因此,我正在完成我的第一个 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(使用前将#替换为@)

如何确保 WPF 数据绑定重构安全? 的相关文章

随机推荐

  • 如何在 C# 项目中使用 Windows 命令行安装 Nuget 包?

    我已经下载了 NuGet 版本 5 1 0 并尝试使用 cmd 安装其中一个包 log4net 它失败了 下面是错误 Microsoft Windows 版本 10 0 19042 1348 c Microsoft Corporation
  • Glassfish 中外部库的放置位置

    我使用 Netbeans 7 创建了一个 JSF2 项目 并成功将其部署在 Glassfish 3 1 上 不过 ear 文件已经变得相当大 6 5mb 其中大部分由外部 jar 文件 如 apache commons solrj prim
  • npm install openssl 在 Windows 10 上失败

    我在 Win10 的 Node js 命令窗口中运行以下命令 它失败了 有人知道如何解决它吗 我正在运行 Node js v7 3 0 C Users haozhang gt npm install openssl C Users haoz
  • WordPress,pre_get_posts 中有多个meta_key

    是否可以添加两个meta key s in pre get posts 我当前的查询 query gt set s query gt set meta key cat adresse stadtteil query gt set meta
  • 类别方法可以被重写吗? IOS

    我正在尝试计划如何向某些对象的所有实例添加一些方法 我认为向父对象 UIViewController 添加一个类别可以满足我想要做的事情 但是我可以重写以这种方式添加的方法吗 大多数情况下 子类将使用默认方法 但我确实知道我需要至少重写该方
  • 在 Android 操作系统中使用 SSLSocket 的 TLS 连接速度很慢

    我正在开发一个 Android 应用程序 它使用 SSLSocket 连接到服务器 这是我正在使用的代码 Connect if socket null socket isClosed socket isConnected if socket
  • “var self = this”方法背后的基本原理是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 JS var self this 当查看用 JavaScript 编写的任意代码 例如在 GitHub 上 时 许多开发人员使用var self this然后使用self代替this来引用当前对象 这
  • 为什么 Hash#select 和 Hash#reject 将键传递给一元块?

    我的理解是Hash select and Hash reject每个都传递一个键及其值的数组 key value 作为每次迭代的单个块参数 您可以使用隐式破坏性赋值直接在块内单独选取它们 a 1 b 2 select k v k a gt
  • 如何为 IXmlSerialized 类型添加命名空间前缀

    我有以下类定义 XmlRoot ElementName person Namespace MyNamespace public class Person IXmlSerializable public string FirstName ge
  • 包安装错误 - 实体框架

    当我尝试创建 ADO NET 实体数据模型时发生错误 错误说 预安装的软件包引用了缺失的注册表 价值 找不到具有名称的注册表项 EntityFrameworkVisualStudio14Tools 下 软件 NuGet 存储库 我使用的是
  • 在后台启动 jenkins

    我正在使用 war 文件在我的服务器上运行 jenkins 他们说用 java jar jenkins war 来源 https wiki jenkins ci org display JENKINS Starting and Access
  • 什么 Maven 工件包含 javax.ws.rs.Path?

    我正在研究 Bill Burke 编写的 Restful Java with JAX RS 中的示例 我正在使用 intellij 并创建了一个 Maven 项目来制作 Hello World Web 服务 我理解 JAX RS 是一个规范
  • 如何对 Laravel 5.7“电子邮件验证”电子邮件发送进行排队

    Laravel 5 7 包含的 电子邮件验证 功能运行良好 但异步电子邮件发送 在用户注册或重新发送链接页面期间 并不理想 有没有办法通过队列发送电子邮件验证电子邮件 而无需在 Laravel 5 7 中重写整个电子邮件验证 没有内置的方法
  • 详细披露按下后注释详细信息?

    我有一个 MKMapView 注释对象 它有一个正确的标注附件详细信息披露按钮 当按下按钮时 我使用 addTarget action forControlEvent 调用一个选择器方法 该方法创建一个详细视图控制器并将其推送到视图堆栈上
  • 如何在 Visual C++ 中调试外部库 (OpenCV)?

    我正在用VC 2008开发一个项目 该项目使用 OpenCV 库 但我想这适用于任何其他库 我正在使用调试配置 链接器属性包括库 lib 的调试版本作为附加依赖项 在 工具 选项 下的 VC 目录中 我设置了包含目录 lib 目录以及库的源
  • hadoop - namenode上的连接被拒绝

    我在网上和stackoverflow上搜索了很长时间 但没有用 我已经在 2 节点集群设置中安装了 hadoop yarn 2 2 0 但出了问题 当我在主节点上使用 start dfs sh 和 start yarn sh 启动 hado
  • 使用新的 csproj 在 PDB 中嵌入 C# 源代码

    最近发布的 NET 工具似乎支持在 PDB 中嵌入 C 这应该会改善进入第三方等的体验 csc 我可以清楚地看到 embed 选项 将所有源文件嵌入到 PDB 中 但是 似乎没有任何方法可以在 csproj 中指定这一点 此外 似乎没有任何
  • Html2Canvas 调整大小

    我正在使用 html2canvas 来获取网页的屏幕截图并将其呈现为缩略图 好吧 400x300 不完全是缩略图 基于截图控制台代码 除了缩略图部分之外 一切都运行良好 如何将图像尺寸设置为 400x300 在 firebug 中 我将该属
  • 如何在 XSD 中添加条件验证:

    现有的 XSD 片段
  • 如何确保 WPF 数据绑定重构安全?

    因此 我正在完成我的第一个 WPF 项目 并且我很喜欢到目前为止所看到的内容 学习曲线比我预期的要多 但尽管如此 WPF 还是很酷的 然而 我在数据绑定概念上遇到了一些困难 我的一个具体问题是如何使我的数据绑定声明重构安全 考虑这个例子 p