Freigeben über


Gewusst wie: Implementieren von PriorityBinding

Aktualisiert: November 2007

PriorityBinding in Windows Presentation Foundation (WPF) funktioniert durch Angabe einer Liste von Bindungen. Die folgende Liste der Bindungen ist absteigend nach Priorität geordnet. Wenn die Bindung mit der höchsten Priorität erfolgreich einen Wert zurückgibt, wenn sie verarbeitet wird, dann müssen die anderen Bindungen in der Liste nicht mehr verarbeitet werden. Möglicherweise nimmt die Auswertung der Bindung mit der höchsten Priorität einige Zeit in Anspruch. Es wird so lange die Bindung mit der nächsten Priorität, die erfolgreich einen Wert zurückgibt, verwendet, bis eine Bindung mit einer höheren Priorität einen Wert erfolgreich zurückgibt.

Beispiel

Um die Funktionsweise von PriorityBinding zu veranschaulichen, wurde das AsyncDataSource-Objekt mit den folgenden drei Eigenschaften erstellt: FastDP, SlowerDP und SlowestDP.

Der get-Accessor von FastDP gibt den Wert des _fastDP-Datenmembers zurück.

Der get-Accessor von SlowerDP wartet 3 Sekunden, bevor der Wert des _slowerDP-Datenmembers zurückgegeben wird.

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

Tipp

Dieses Beispiel dient nur der Veranschaulichung. In den Microsoft .NET-Richtlinien wird die Definition von Eigenschaften, die erheblich langsamer als ein Satz von Feldern sind, nicht empfohlen. Weitere Informationen finden Sie unter Auswählen zwischen Eigenschaften und Methoden.

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

Die Text-Eigenschaft wird mit PriorityBinding an den oben erwähnten AsyncDS gebunden:

<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 das Bindungsmodul die Binding-Objekte verarbeitet, wird zunächst das erste Binding-Element verarbeitet, das an die SlowestDP-Eigenschaft gebunden ist. Wenn dieses Binding-Element verarbeitet wurde, gibt es keinen Wert erfolgreich zurück, da es 5 Sekunden deaktiviert ist. Deshalb wird das nächste Binding-Element verarbeitet. Das nächste Binding-Element gibt keinen Wert erfolgreich zurück, da es 3 Sekunden aktiviert ist. Das Bindungsmodul fährt mit dem nächsten Binding-Element fort, das an die FastDP-Eigenschaft gebunden ist. Dieses Binding-Element gibt den Wert "Fast Value" zurück. Der TextBlock zeigt jetzt den Wert "Fast Value" an.

Nach 3 Sekunden gibt die SlowerDP-Eigenschaft den Wert "Slower Value" zurück. Der TextBlock zeigt dann den Wert "Slower Value" an.

Nach 5 Sekunden gibt die SlowestDP-Eigenschaft den Wert "Slowest Value" zurück. Diese Bindung hat die höchste Priorität, weil sie zuerst in der Liste angezeigt wird. Der TextBlock zeigt jetzt den Wert "Slowest Value" an.

Weitere Informationen über erfolgreiche Rückgabewerte von einer Bindung finden Sie unter PriorityBinding.

Das vollständige Beispiel finden Sie unter Beispiel für das Binden mit PriorityBinding.

Siehe auch

Konzepte

Übersicht über Datenbindung

Referenz

Binding.IsAsync

Weitere Ressourcen

Beispiel zur Datenbindung

Gewusst-wie-Themen zur Datenbindung