Binding 和 x:Bind 之间的区别

Posted

技术标签:

【中文标题】Binding 和 x:Bind 之间的区别【英文标题】:Difference between Binding and x:Bind 【发布时间】:2016-09-20 18:00:02 【问题描述】:

在 UWP 中使用什么,Bindingx:Bind,它们之间有什么区别?

因为我看到很多帖子都使用Binding,而我只在UWP 中绑定x:Bind

在 MSDN 主页上只说“x:BindBinding 创建的绑定对象在功能上基本上是等效的。” x:Bind 更快

但是它们之间有什么区别呢?

因为“在很大程度上功能等效”并不意味着等效。

我引用的链接:MSDN

所以我的问题是:

在 UWP 中使用 Binding 或 x:Bind 有什么区别?

【问题讨论】:

可以说,最显着的区别是(如x:Bind markup extension 中所述):“编译的绑定是强类型的,将解析路径中每个步骤的类型。如果返回的类型没有成员,编译时会失败。" 我想知道 x:Bind 比 Binding 快多少。我可以期望它快 1.5 倍、2 倍、10 倍等吗?由于这一切都发生在 XAML 中,我不知道有什么方法可以衡量它。 【参考方案1】:

以下可能不完整,但一些主要区别是

旧式Binding

绑定到 DataContext 绑定到属性名称,灵活选择实际的源类型

新风格x:Bind

绑定到框架元素(代码隐藏类) 需要在编译时修复所有类型 默认为更节俭的 OneTime 模式

而starting with build 14393、x:Bind 支持:

直接 BooleanToVisibility 绑定,没有 ValueConverter 扩展的函数绑定 铸造 字典索引器

较新的 x:Bind 在运行时要快一些,但同样重要的是,它会为错误的绑定提供编译器错误。使用 Binding 在大多数情况下,您只会看到一个空的 Control。

深入比较结帐:x:Bind and Binding feature comparison

【讨论】:

我会添加示例来解释每个语句的含义。在我的特殊情况下,Binding Data.Name, Mode=OneWay 不适用于更新(尽管 Data 和 Name 都在实现 INotifyPropertyChanged),但是 x:Bind Data.Name, Mode=OneWay 完成了这项工作。【参考方案2】:

x:Bind 执行在编译时生成的专用代码。 Binding 使用通用运行时对象检查。因此,x:Bind 具有出色的性能并提供绑定表达式的编译时验证。它通过使您能够在作为页面的部分类生成的代码文件中设置断点来支持调试。

因为x:Bind 使用生成的代码来实现它的好处,它在编译时需要类型信息。这意味着您不能绑定到您提前不知道类型的属性。因此,您不能将 x:Bind 与 Object 类型的 DataContext 属性一起使用,并且在运行时也会发生更改。 x:Bind 标记扩展(Windows 10 的新功能)是Binding 的替代品。 x:Bind 缺少Binding 的一些功能,但它比Binding 运行的时间和内存更少,并且支持更好的调试。

【讨论】:

你能添加你引用的来源吗? @AxelMeier 答案引用了x:Bind markup extension 准确地说第一段来自本页简介第二段 来自此页面的 Remarks 部分

以上是关于Binding 和 x:Bind 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合

MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过 ButtonBase 触发命令

MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过非 ButtonBase 触发命令

关于UWP数据绑定的一个坑 x:bind修改为binding

UWP: 掌握编译型绑定 x:Bind

UWP: 掌握编译型绑定 x:Bind