Freigeben über


Vorgehensweise: Implementieren von PriorityBinding

PriorityBinding in Windows Presentation Foundation (WPF) funktioniert, indem eine Liste von Bindungen angegeben wird. Die Reihenfolge der Bindungen ist von der höchsten Priorität zur niedrigsten Priorität sortiert. Wenn die Bindung mit der höchsten Priorität einen Wert erfolgreich zurückgibt, wenn sie verarbeitet wird, ist es nie erforderlich, die anderen Bindungen in der Liste zu verarbeiten. Es kann der Fall sein, dass die Bindung mit der höchsten Priorität lange dauert, bis sie ausgewertet wird. Die nächsthöhere Priorität, die einen Wert erfolgreich zurückgibt, wird verwendet, bis eine Bindung mit noch höherer Priorität einen Wert erfolgreich zurückgibt.

Beispiel

Um zu veranschaulichen, wie PriorityBinding funktioniert, wurde das AsyncDataSource-Objekt mit den folgenden drei Eigenschaften erstellt: FastDP, SlowerDPund SlowestDP.

Die Zugriffs-Methode von FastDP gibt den Wert des Datenmitglieds _fastDP zurück.

Der Get-Accessor von SlowerDP wartet 3 Sekunden, bevor er den Wert des Datenmitglieds _slowerDP zurückgibt.

Der Get-Accessor von SlowestDP wartet 5 Sekunden, bevor der Wert des Datenmitglieds _slowestDP zurückgegeben wird.

Anmerkung

Dieses Beispiel dient nur zu Demonstrationszwecken. Die .NET-Richtlinien empfehlen, keine Eigenschaften zu definieren, die um Größenordnungen langsamer sind als ein Feldsatz. Weitere Informationen finden Sie unter Auswählen zwischen Eigenschaften und Methoden.

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

Die Text-Eigenschaft wird mithilfe von PriorityBindingmit dem obigen AsyncDS verbunden.

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

Wenn die Bindungsmaschine die Binding-Objekte verarbeitet, beginnt sie mit dem ersten Binding, das an die SlowestDP-Eigenschaft gebunden ist. Wenn dieses Binding verarbeitet wird, wird kein Wert erfolgreich zurückgegeben, weil es für 5 Sekunden schläft, sodass das nächste Element Binding verarbeitet wird. Der nächste Binding gibt keinen Wert erfolgreich zurück, da er 3 Sekunden lang schläft. Die Bindungsengine wechselt dann zum nächsten Binding-Element, das an die FastDP-Eigenschaft gebunden ist. Dieser Binding gibt den Wert "Schnellwert" zurück. Die TextBlock zeigt nun den Wert "Schneller Wert" an.

Nach 3 Sekunden gibt die SlowerDP-Eigenschaft den Wert "Langsamerer Wert" zurück. Die TextBlock zeigt dann den Wert "Langsamerer Wert" an.

Nach Ablauf von 5 Sekunden gibt die SlowestDP-Eigenschaft den Wert "Langsamster Wert" zurück. Diese Bindung hat die höchste Priorität, da sie zuerst aufgeführt wird. Die TextBlock zeigt nun den Wert "langsamster Wert" an.

Weitere Informationen darüber, was als ein erfolgreicher Rückgabewert aus einer Bindung betrachtet wird, finden Sie unter PriorityBinding.

Siehe auch