Share via


Gewusst wie: Implementieren von PriorityBinding

PriorityBinding in Windows Presentation Foundation (WPF) funktioniert durch Angabe einer Liste von Bindungen. Die Liste der Bindungen ist von der höchsten zur niedrigsten Priorität sortiert. Wenn die Bindung mit der höchsten Priorität bei ihrer Verarbeitung erfolgreich einen Wert zurückgibt, müssen die anderen Bindungen in der Liste grundsätzlich nicht verarbeitet werden. Es kann vorkommen, dass die Auswertung der Bindung mit der höchsten Priorität lange dauert. Dann wird die Bindung mit der nächsthöheren Priorität, die einen Wert erfolgreich zurückgibt, so lange verwendet, bis eine Bindung mit einer höheren Priorität einen Wert erfolgreich zurückgibt.

Beispiel

Um zu demonstrieren, wie PriorityBinding funktioniert, 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.

Hinweis

Dieses Beispiel dient ausschließlich Demonstrationszwecken. In den .NET-Leitlinien wird davon abgeraten, Eigenschaften festzulegen, die um ein Vielfaches langsamer sind, als es ein Feldsatz sein würde. Weitere Informationen finden Sie unter Wä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 ist über PriorityBinding an das oben genannte 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, beginnt es mit der ersten Binding, die an die SlowestDP-Eigenschaft gebunden ist. Bei der Verarbeitung dieser Binding wird kein Wert erfolgreich zurückgegeben, da sie 5 Sekunden inaktiv ist, sodass das nächste Binding-Element verarbeitet wird. Die nächste Binding gibt keinen Wert zurück, weil sie 3 Sekunden inaktiv ist. Das Bindungsmodul fährt dann mit dem nächsten Binding-Element fort, das an die FastDP-Eigenschaft gebunden ist. Diese Binding gibt dem Wert „Fast Value“ zurück. Die TextBlock zeigt nun den Wert „Fast Value“ an.

Nach Ablauf von 3 Sekunden gibt die SlowerDP-Eigenschaft den Wert „Slower Value“ zurück. Anschließend zeigt die TextBlock den Wert „Slower Value“ an.

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

Unter PriorityBinding finden Sie Informationen darüber, was als erfolgreicher Rückgabewert einer Bindung gilt.

Weitere Informationen