WPF 高级绑定与自定义控件开发
1. 高级绑定能力之 PriorityBinding
在网页浏览中,图片加载前通常会先显示占位符,接着是简短描述,最后才呈现真实图片。这其实就是一种绑定场景。设想有一个控件最终要显示图片,若已获取图片,直接绑定即可;但图片下载需时间,此方法就不可行了。
你可以构建一个通用存储并绑定到它,待数据可用时,用后台代码替换存储中的值,浏览器或许就是这样做的。然而,这似乎绕过了绑定系统,而非让其自动处理。
PriorityBinding 旨在解决这类问题,它允许为要显示的项目提供多个不同来源,如图片、说明文本和默认图像。若某个来源不可用,代码会依次使用下一个来源。另一个适用场景是作用域相关情况,若用户指定了值则使用该值;若未指定,管理员指定的值可用则使用;若都没有,就使用默认值。
与 MultiBinding 类似,PriorityBinding 可替代任何常规绑定。它包含一个绑定列表,会逐个遍历,直到找到能返回数据的绑定。由于底层的属性系统,若某个绑定最终获取到数据(如图片加载完成),会自动更新属性。
以颜色选择器为例,当前颜色以十六进制值显示,若所选颜色有名称,希望显示名称而非十六进制值。可以构建一个单一值转换器来实现,但这样会受限于该转换器格式化值的方式。使用 PriorityBinding 则可设置多个转换器,结果将基于“最佳”(至少是第一个)显示方式呈现。
首先,需要一个值转换器来判断颜色是否为命名颜色,代码如下:
using System; using System.Collections.Generic