Share via


Comment : implémenter PriorityBinding

Mise à jour : novembre 2007

PriorityBinding dans Windows Presentation Foundation (WPF) fonctionne en spécifiant une liste de liaisons. Cette liste est classée de la priorité la plus élevée à la priorité la plus basse. Si la liaison de priorité la plus élevée retourne une valeur avec succès lors de son traitement, le traitement des autres liaisons de la liste est inutile. Dans le cas où l'évaluation de la liaison de priorité la plus élevée nécessite du temps, la priorité la plus élevée suivante qui retourne une valeur avec succès sera alors utilisée jusqu'à ce qu'une liaison d'une priorité supérieure retourne avec succès une valeur.

Exemple

Pour expliquer le fonctionnement de PriorityBinding, l'objet AsyncDataSource a été créé avec les trois propriétés suivantes : FastDP, SlowerDP et SlowestDP.

L'accesseur get de FastDP retourne la valeur des données membre _fastDP.

L'accesseur get de SlowerDP attend trois secondes avant de retourner la valeur des données membre _slowerDP.

L'accesseur get de SlowestDP attend cinq secondes avant de retourner la valeur des données membre _slowestDP.

Remarque :

Cet exemple est fourni à des fins de démonstration uniquement. Le Microsoft .NET recommande de ne pas définir de propriétés plus lentes que ne le serait un champ set. Pour plus d'informations, consultez Choix entre des propriétés et des méthodes.

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

La propriété Text crée une liaison avec AsyncDS ci-dessus à l'aide de 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 élément Binding, qui est lié à la propriété SlowestDP. Lorsque cet élément Binding est traité, il ne retourne pas de valeur avec succès, car il est en état de veille pour 5 secondes ; l'élément Binding suivant est alors traité. L'élément Binding suivant ne retourne pas de valeur avec succès, car il est en état de veille pour 3 secondes. Le moteur de liaison se place ensuite sur l'objet Binding suivant, qui est lié à la propriété FastDP. Cet élément Binding retourne la valeur « Fast Value ». Le TextBlock affiche maintenant la valeur « Fast Value ».

Après 3 secondes, la propriété SlowerDP retourne la valeur « Slower Value ». Le TextBlock affiche ensuite la valeur « Slower Value ».

Après 5 secondes, la propriété SlowestDP retourne la valeur « Slowest Value ». Cette liaison a la priorité la plus élevée, car elle est affichée en premier. Le TextBlock affiche maintenant la valeur « Slowest Value ».

Consultez PriorityBinding pour plus d'informations sur le concept de valeur de retour avec succès à partir d'une liaison.

Pour l'exemple complet, consultez Liaison à l'aide de PriorityBinding, exemple.

Voir aussi

Concepts

Vue d'ensemble de la liaison de données

Référence

Binding.IsAsync

Autres ressources

Exemples de liaisons de données

Rubriques Comment relatives aux liaisons de données