共用方式為


HOW TO:實作 PriorityBinding

Windows Presentation Foundation (WPF) 中的 PriorityBinding 是透過指定繫結清單來運作。 繫結清單是從最高優先權排到最低優先權。 如果處理的最高優先權繫結順利傳回值,就絕不再需要處理清單中的其他繫結。 如果最高優先權繫結需要長時間評估,則在較高優先權繫結順利傳回值之前,會先使用下一個順利傳回值的最高優先權。

範例

為了示範 PriorityBinding 的運作方式,已建立具有下列三個屬性的 AsyncDataSource 物件:FastDP、SlowerDP 和 SlowestDP。

FastDP 的 get 存取子 (Accessor) 會傳回 _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 物件時,是從繫結至 SlowestDP 屬性的第一個 Binding 開始。 在處理這個 Binding 時,因為它會休眠 5 秒,所以並不會順利傳回值,因此會處理下一個 Binding 項目。 又因為下一個 Binding 會休眠 3 秒,所以並不會順利傳回值。 繫結引擎接著會移至下一個繫結至 FastDP 屬性的 Binding 項目。 這個 Binding 會傳回 "Fast Value" 值。 TextBlock 現在會顯示 "Fast Value" 值。

而經過 3 秒之後,SlowerDP 屬性傳回 "Slower Value" 值。 TextBlock 則會顯示 "Slower Value" 值。

而經過 5 秒之後,SlowestDP 屬性傳回 "Slowest Value" 值。 該繫結由於列在最前面,所以具有最高優先權。 TextBlock 現在會顯示 "Slowest Value" 值。

如需視為繫結之成功傳回值的詳細資訊,請參閱 PriorityBinding

請參閱

參考

Binding.IsAsync

概念

資料繫結概觀

其他資源

資料繫結 HOW TO 主題