如何:实现 PriorityBinding

Windows Presentation Foundation (WPF) 中的 PriorityBinding 通过指定绑定列表来发挥作用。 绑定列表按从最高优先级到最低优先级的顺序排列。 如果最高优先级绑定在处理时成功返回值,则无需处理列表中的其他绑定。 如果计算优先级最高的绑定需要很长时间,那么将会使用成功返回值的次高优先级,直到优先级较高的绑定成功返回值。

示例

为了演示 PriorityBinding 的工作原理,创建的 AsyncDataSource 对象具备以下三个属性:FastDPSlowerDPSlowestDP

FastDP 的 get 访问器返回 _fastDP 数据成员的值。

SlowerDP 的 get 访问器等待 3 秒,然后返回 _slowerDP 数据成员的值。

SlowestDP 的 get 访问器等待 5 秒,然后返回 _slowestDP 数据成员的值。

注意

此示例只为了方便演示。 .NET 指南建议不要定义比字段集慢几个数量级的属性。 有关详细信息,请参阅在属性和方法之间进行选择

public class AsyncDataSource
{
  private string _fastDP;
  private string _slowerDP;
  private string _slowestDP;

  public AsyncDataSource()
  {
  }

  public string FastDP
  {
    get { return _fastDP; }
    set { _fastDP = value; }
  }

  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; }
  }
}
Public Class AsyncDataSource
    ' Properties
    Public Property FastDP As String
        Get
            Return Me._fastDP
        End Get
        Set(ByVal value As String)
            Me._fastDP = value
        End Set
    End Property

    Public Property SlowerDP As String
        Get
            Thread.Sleep(3000)
            Return Me._slowerDP
        End Get
        Set(ByVal value As String)
            Me._slowerDP = value
        End Set
    End Property

    Public Property SlowestDP As String
        Get
            Thread.Sleep(5000)
            Return Me._slowestDP
        End Get
        Set(ByVal value As String)
            Me._slowestDP = value
        End Set
    End Property


    ' Fields
    Private _fastDP As String
    Private _slowerDP As String
    Private _slowestDP As String
End Class

Text 属性使用 PriorityBinding 绑定到上述 AsyncDS

<Window.Resources>
  <c:AsyncDataSource SlowestDP="Slowest Value" SlowerDP="Slower Value"
                     FastDP="Fast Value" x:Key="AsyncDS" />
</Window.Resources>
  
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"
  DataContext="{Binding Source={StaticResource AsyncDS}}">
  <TextBlock FontSize="18" FontWeight="Bold" Margin="10"
    HorizontalAlignment="Center">Priority Binding</TextBlock>
  <TextBlock Background="Honeydew" Width="100" HorizontalAlignment="Center">
    <TextBlock.Text>
      <PriorityBinding FallbackValue="defaultvalue">
        <Binding Path="SlowestDP" IsAsync="True"/>
        <Binding Path="SlowerDP" IsAsync="True"/>
        <Binding Path="FastDP" />
      </PriorityBinding>
    </TextBlock.Text>
  </TextBlock>	
</StackPanel>

当绑定引擎处理 Binding 对象时,它将从第一个 Binding 开始,该绑定绑定到 SlowestDP 属性。 处理此 Binding 时,它不会成功返回值,因为它正处于持续 5 秒的休眠状态,因此将处理下一个 Binding 元素。 下一个 Binding 不会成功返回值,因为它正处于持续 3 秒的休眠状态。 然后绑定引擎会移动到下一个绑定到 FastDP 属性的 Binding 元素。 此 Binding 返回值“快速值”。 TextBlock 现在显示值“快速值”。

3 秒后,SlowerDP 属性返回值“较慢值”。 之后 TextBlock 会显示值“较慢值”。

5 秒后,SlowestDP 属性返回值“最慢值”。 该绑定具有最高优先级,因为它列在最前面。 TextBlock 现在显示值“最慢值”。

有关被视为从绑定成功返回值的信息,请参阅 PriorityBinding

另请参阅