【问题标题】:How does a Binding actually work?绑定实际上是如何工作的?
【发布时间】:2011-05-06 06:01:29
【问题描述】:

我已经学习 WPF 几个月了,我对一件事感到好奇。绑定实际上是如何工作的?我的意思是,在引擎盖下发生了什么。我不希望这里的任何人会给出详细的解释,但也许是一个很好的资源或链接,可以在哪里阅读类似的内容。我一直在搜索和搜索这个,但到目前为止还没有什么好的结果。

我意识到,要完全理解这一点,您可能必须了解框架的大部分内容,但稍微了解一些基本知识会很好。

谢谢

【问题讨论】:

    标签: c# wpf data-binding xaml binding


    【解决方案1】:

    在绑定中有两个方面需要考虑,将值输入到 UI 以及让 UI 在其 DataContext 中的更改时得到通知。

    基本上你可以将几乎任何东西绑定到任何 POCO 对象上,该对象不需要实现任何特殊的东西。普通对象的限制是当底层值改变时绑定目标不会被告知。

    属性更改通过以下三种机制之一传播:

    依赖属性:值发生变化时会通知绑定系统,也可用于动画。

    INotifyPropertyChanged :如果绑定到实现 INotifyPropertyChanged 的​​对象上的属性,则绑定系统将寻找订阅 PropertyChanged 事件并更新绑定目标,当引发此事件时,属性名称作为字符串发送。

    *Property*Changed 事件:绑定将查找的最后一件事是名称与源属性相同且最后已更改的事件,因此 Name 属性需要具有名为 NameChanged 的​​公共事件,这允许 WPF 绑定到较旧的 .net 类,例如 1.1。

    【讨论】:

      【解决方案2】:

      我不太了解 WPF 中绑定的具体细节,但如果它与 System.ComponentModel 和 Windows 窗体中的绑定背后的原理相同,那么我最近写的一篇博客文章可能会帮助您了解它:

      Some Background on Windows Forms Data Binding

      基本上,绑定源必须实现IListIListSourceITypedListIBindingList。通过反射或显式定义,数据源公开了描述其可绑定属性的PropertyDescriptor 对象。这些属性的名称(可能是也可能不是数据源中包含的对象的实际属性的名称 - 例如在DataTable 中,它们是列名)与DisplayMember/ValueMember 属性匹配或者,对于 WPF,绑定路径。

      【讨论】:

      • 这与 WPF 绑定有何关系?
      • @benPearce 我想 WPF 使用与 System.ComponentModel 中定义的相同的底层数据绑定概念 - 在整个 .NET 框架中使用的功能。
      • 在 WPF 绑定中,不需要特殊的接口或属性,如我的回答中所述。属性名称解析是通过反射完成的
      • @benPearce 反射对于普通对象来说很好,但是像DataSet 这样的东西不能单独使用反射来绑定。这就是为什么我们有TypeDescriptorPropertyDescriptor 等。
      【解决方案3】:

      这是一个很难回答的问题。我认为答案大致有两个方面。首先是文档。如果您浏览了绑定表达式的所有文档,包括路径是如何构建的,例如像BindingOperations 这样的辅助类,你可以找到很多。如果这还不够,您可以随时从Microsoft Source Initiative 站点下载代码以深入了解代码。

      【讨论】:

        猜你喜欢
        • 2021-01-21
        • 2011-09-27
        • 2021-12-16
        • 2013-03-14
        • 2021-03-23
        • 2011-02-11
        • 2017-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多