【问题标题】:Is Binding or Visual State approach preferable for performance?绑定或视觉状态方法更适合性能吗?
【发布时间】:2013-08-16 19:12:59
【问题描述】:

假设我有一个很大的 XAML 页面。此页面上有几十个文本框、按钮等,这些控件需要根据各种条件(权限、视图模型状态等)显示/隐藏/修改。设置视觉转换的两种可能方法是:

  1. 使用可视状态管理器; bind the state transitions 到视图模型中的属性
  2. 在适用的情况下使用转换器(布尔到可见性、字符串到颜色等)将控件属性绑定到它们各自的视图模型属性

我的问题:纯粹从性能(速度和内存占用)的角度来看,其中一种方法明显更好吗?第二种方法,用绑定加载页面,是否容易压低它?或者差异可能可以忽略不计?

【问题讨论】:

    标签: performance xaml binding visualstates


    【解决方案1】:

    我没有测试或基准来证明这一点,但如下推理表明视觉状态方法应该更快。

    对于绑定场景:

    • 来自视图的每次绑定都会触发一个事件处理程序,每次引发PropertyChanged
    • 这些处理程序中的每一个都必须每次任何视图模型属性更改时执行。
    • 同样,当您更改视图模型属性以更新视图的配置时,所有必须为您更改的每个属性运行处理程序。

    视觉状态场景没有这些处理程序需要处理:

    • VisualStateManager 没有处理程序,因此它在不需要时不会消耗任何 CPU(它会忽略“PropertyChanged”,或者在最坏的情况下,只有一个侦听器附加到“CurrentState”属性)。
    • 要触发视觉状态,只需要运行附加的 Storyboard —— PropertyChanged 不会被引发(除了可能一次,最多,如上所述),因此所有处理程序都不需要运行多次。

    使用 Visual State Manager 显然比设置过多的视图到视图模型绑定更能提高性能。


    编辑 John Gossman 还 noted(很久以前)认为绑定可能很重,并且可能开始在大型应用程序中消耗过多的内存。在链接的文章中,他声称通过用单个静态回调替换所有绑定节省了 100MB。

    【讨论】: