Comment : implémenter PriorityBindingHow to: Implement PriorityBinding

PriorityBinding dans Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) fonctionne en spécifiant une liste de liaisons.PriorityBinding in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) works by specifying a list of bindings. La liste des liaisons est classée de la priorité la plus élevée à la priorité la plus basse.The list of bindings is ordered from highest priority to lowest priority. Si la liaison de priorité la plus élevée retourne une valeur correctement lorsqu’elle est traitée, il n’est jamais nécessaire de traiter les autres liaisons de la liste.If the highest priority binding returns a value successfully when it is processed then there is never a need to process the other bindings in the list. Cela peut être le cas où la liaison de priorité la plus élevée prend beaucoup de temps pour être évaluée, la priorité la plus élevée qui retourne une valeur avec succès sera utilisée jusqu’à ce qu’une liaison d’une priorité plus élevée retourne une valeur avec succès.It could be the case that the highest priority binding takes a long time to be evaluated, the next highest priority that returns a value successfully will be used until a binding of a higher priority returns a value successfully.

ExempleExample

Pour illustrer le fonctionnement de PriorityBinding, l’objet AsyncDataSource a été créé avec les trois propriétés suivantes : FastDP, SlowerDPet SlowestDP.To demonstrate how PriorityBinding works, the AsyncDataSource object has been created with the following three properties: FastDP, SlowerDP, and SlowestDP.

L’accesseur Get de FastDP retourne la valeur du membre de données _fastDP.The get accessor of FastDP returns the value of the _fastDP data member.

L’accesseur Get de SlowerDP attend pendant 3 secondes avant de retourner la valeur du membre de données _slowerDP.The get accessor of SlowerDP waits for 3 seconds before returning the value of the _slowerDP data member.

L’accesseur Get de SlowestDP attend 5 secondes avant de retourner la valeur du membre de données _slowestDP.The get accessor of SlowestDP waits for 5 seconds before returning the value of the _slowestDP data member.

Notes

L’exemple est uniquement fourni à des fins de démonstration.This example is for demonstration purposes only. Les instructions .NET recommandent de définir des propriétés dont l’ordre est plus lent qu’un jeu de champs.The .NET guidelines recommend against defining properties that are orders of magnitude slower than a field set would be. Pour plus d’informations, consultez choix entre les propriétés et les méthodes.For more information, see Choosing Between Properties and Methods.

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

La propriété Text se lie aux AsyncDS ci-dessus à l’aide de PriorityBinding:The Text property binds to the above AsyncDS using 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>

Lorsque le moteur de liaison traite les objets Binding, il commence par le premier Binding, qui est lié à la propriété SlowestDP.When the binding engine processes the Binding objects, it starts with the first Binding, which is bound to the SlowestDP property. Lorsque cette Binding est traitée, elle ne retourne pas de valeur avec succès, car elle est en veille pendant 5 secondes, de sorte que l’élément Binding suivant est traité.When this Binding is processed, it does not return a value successfully because it is sleeping for 5 seconds, so the next Binding element is processed. La Binding suivante ne retourne pas de valeur avec succès, car elle est en veille pendant 3 secondes.The next Binding does not return a value successfully because it is sleeping for 3 seconds. Le moteur de liaison se déplace ensuite sur l’élément de Binding suivant, qui est lié à la propriété FastDP.The binding engine then moves onto the next Binding element, which is bound to the FastDP property. Cette Binding retourne la valeur « Fast Value ».This Binding returns the value "Fast Value". La TextBlock affiche maintenant la valeur « Fast Value ».The TextBlock now displays the value "Fast Value".

Au bout de 3 secondes, la propriété SlowerDP retourne la valeur « plus lente ».After 3 seconds elapses, the SlowerDP property returns the value "Slower Value". Le TextBlock affiche ensuite la valeur « valeur plus lente ».The TextBlock then displays the value "Slower Value".

Une fois 5 secondes écoulées, la propriété SlowestDP retourne la valeur « la valeur la plus lente ».After 5 seconds elapses, the SlowestDP property returns the value "Slowest Value". Cette liaison a la priorité la plus élevée, car elle est listée en premier.That binding has the highest priority because it is listed first. Le TextBlock affiche maintenant la valeur « valeur la plus lente ».The TextBlock now displays the value "Slowest Value".

Consultez PriorityBinding pour plus d’informations sur ce qui est considéré comme une valeur de retour réussie d’une liaison.See PriorityBinding for information about what is considered a successful return value from a binding.

Voir aussiSee also