Så här gör du: Implementera PriorityBinding

PriorityBinding i Windows Presentation Foundation (WPF) fungerar genom att ange en lista med bindningar. Listan över bindningar sorteras från högsta prioritet till lägsta prioritet. Om den högsta prioritetsbindningen returnerar ett värde när det bearbetas behöver du aldrig bearbeta de andra bindningarna i listan. Det kan vara så att bindningen med högst prioritet tar lång tid att utvärdera. Den näst högsta prioriteten som returnerar ett värde kommer att användas tills en bindning med högre prioritet returnerar ett värde.

Exempel

För att visa hur PriorityBinding fungerar har AsyncDataSource-objektet skapats med följande tre egenskaper: FastDP, SlowerDPoch SlowestDP.

Get-accessorn för FastDP returnerar värdet av datamedlemmen _fastDP.

get-tillgångsfunktionen för SlowerDP väntar i 3 sekunder innan värdet av _slowerDP-medlemmen returneras.

Get-accessorn för SlowestDP väntar 5 sekunder innan den returnerar värdet av _slowestDP:s datamedlem.

Anmärkning

Det här exemplet är endast i demonstrationssyfte. .NET-riktlinjerna rekommenderar att du inte definierar egenskaper som är storleksordningar långsammare än en fältuppsättning. Mer information finns i Välja mellan egenskaper och metoder.

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

Egenskapen Text binder till ovanstående AsyncDS med hjälp av PriorityBinding:

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

När bindningsmotorn bearbetar de Binding objekten börjar den med den första Binding, som är bunden till egenskapen SlowestDP. När den här Binding bearbetas returnerar den inte ett värde framgångsrikt eftersom den är inaktiv i 5 sekunder, vilket medför att nästa Binding-element bearbetas. Nästa Binding returnerar inte ett värde eftersom det ligger i viloläge i 3 sekunder. Bindningsmotorn flyttas sedan till nästa Binding element, som är bundet till egenskapen FastDP. Den här Binding returnerar värdet "Fast Value". TextBlock visar nu värdet "Snabbt värde".

Efter 3 sekunder returnerar egenskapen SlowerDP värdet "Långsammare värde". TextBlock visar sedan värdet "Slower Value".

Efter 5 sekunder returnerar egenskapen SlowestDP värdet "Långsammast värde". Bindningen har högsta prioritet eftersom den visas först. TextBlock visar nu värdet "Långsammast värde".

Mer information om vad som anses vara ett lyckat returvärde från en bindning finns i PriorityBinding.

Se även