如何:实现 PriorityBinding

Windows Presentation Foundation (WPF) 中的 PriorityBinding 通过指定绑定列表来工作。 该绑定列表按照优先级由高到低排序。 如果在处理具有最高优先级的绑定时成功返回了一个值,则说明永远不需要处理该列表中的其他绑定。 这有可能发生在以下情况下:当具有最高优先级的绑定需要很长时间来计算时,将使用能够成功返回一个值的次高优先级,直到具有较高优先级的绑定成功返回一个值。

示例

为了演示 PriorityBinding 的工作方式,我们创建了具有以下三个属性的 AsyncDataSource 对象:FastDP、SlowerDP 和 SlowestDP。

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

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

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

注意注意

此示例仅供演示使用。Microsoft .NET 准则建议您定义运算速度比字段集慢多个数量级的属性。有关更多信息,请参见在属性和方法之间选择

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
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; }
    }
}

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 秒钟时间。 绑定引擎随后会转至下一个 Binding 元素,该元素绑定到 FastDP 属性。 该 Binding 返回值“Fast Value”(快值)。 TextBlock 现在显示值“Fast Value”(快值)。

在 3 秒钟之后,SlowerDP 属性将返回值“Slower Value”(较慢的值)。 TextBlock 随后显示值“Slower Value”(较慢的值)。

在 5 秒钟之后,SlowestDP 属性将返回值“Slowest Value”(最慢的值)。 由于该绑定最先列出,因此它的优先级最高。 TextBlock 现在显示值“Slowest Value”(最慢的值)。

有关可以将哪种情况视为能够从绑定中成功返回值的信息,请参见 PriorityBinding

请参见

参考

Binding.IsAsync

概念

数据绑定概述

其他资源

数据绑定帮助主题