PriorityBinding优先级绑定

实现效果:

  1. 成功返回值的第一个绑定成为活动绑定
  2. 绑定引擎继续侦听所有绑定的变化。 如果任意时刻具有较高优先级的某个绑定成功返回值,则该绑定的值将成为活动值,并替换当前值。

clipboard.png

clipboard.png

关键词:

  1. PriorityBinding+FallbackValue
  2. IsAsync

代码:
绑定数据进行赋值

<local:AsyncDataSource SlowestDp="Slowest Value" SlowerDp="Slower Value"
               FastDp="Fast Value" x:Key="AsyncDs" />

当具有最高优先级的绑定需要很长时间来计算时,将使用能够成功返回一个值的次高优先级,直到具有较高优先级的绑定成功返回一个值。
在等待值到达的过程中,绑定会报告 FallbackValue(如果有)或绑定目标属性的默认值。

<TextBlock.Text>
    <PriorityBinding FallbackValue="defaultvalue">
        <Binding Path="SlowestDp" IsAsync="True"/>
        <Binding Path="SlowerDp" IsAsync="True"/>
        <Binding Path="FastDp" />
    </PriorityBinding>
</TextBlock.Text>

FastDP 的 get 访问器返回 _fastDP 数据成员的值。
SlowerDP 的 get 访问器等待 3 秒钟之后返回 _slowerDP 数据成员的值。
SlowestDP 的 get 访问器等待 5 秒钟之后返回 _slowestDP 数据成员的值。

public class AsyncDataSource
{
    private string _slowerDp;
    private string _slowestDp;
    public string FastDp { get; set; }

    public string SlowerDp
    {
        get
        {
            // This simulates a lengthy time before the
            // data being bound to is actualy available.
            Thread.Sleep(3000);
            return _slowerDp;
        }
        set { _slowerDp = value; }
    }

    public string SlowestDp
    {
        get
        {
            // This simulates a lengthy time before the
            // data being bound to is actualy available.
            Thread.Sleep(5000);
            return _slowestDp;
        }
        set { _slowestDp = value; }
    }
}

扩展:

  1. 如果在处理具有最高优先级的绑定时成功返回了一个值,则说明永远不需要处理该列表中的其他绑定。
  2. 如果绑定源属性的 get 访问器可能需要较长时间,请使用 IsAsync 属性。 一个示例是具有从 Web 上进行下载的 get 访问器的图像属性。 将 IsAsync 设置为 true 可以避免在下载发生时阻止 UI。
  3. .NET 准则建议您定义运算速度比字段集慢多个数量级的属性。 在创建类时,请考虑在 get 访问器之外处理执行速度极慢的操作并缓存结果。
  4. BindingBase.FallbackValue 属性:获取或设置当绑定无法返回值时要使用的值。

李志玮
22 声望34 粉丝

求索~~


引用和评论

0 条评论