Comment : implémenter PriorityBinding

PriorityBinding Dans Windows Presentation Foundation (WPF) fonctionne en spécifiant une liste de liaisons. La liste des liaisons est triée de priorité la plus élevée vers la priorité la plus basse. 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. Il peut s’agir du cas où la liaison de priorité la plus élevée prend beaucoup de temps pour être évaluée, la priorité la plus élevée suivante qui retourne une valeur correctement sera utilisée jusqu’à ce qu’une liaison d’une priorité plus élevée retourne une valeur correctement.

Exemple

Pour illustrer le PriorityBinding fonctionnement, l’objet AsyncDataSource a été créé avec les trois propriétés suivantes : FastDP, SlowerDPet SlowestDP.

L’accesseur get de FastDP retourne la valeur du _fastDP membre de données.

Accesseur get des SlowerDP attentes pendant 3 secondes avant de retourner la valeur du _slowerDP membre de données.

Accesseur get des SlowestDP attentes pendant 5 secondes avant de retourner la valeur du _slowestDP membre de données.

Remarque

Cet exemple est fourni à des fins de démonstration uniquement. Les instructions .NET recommandent de définir des propriétés qui sont des ordres de grandeur plus lents qu’un ensemble de champs serait. Pour plus d’informations, consultez Choisir entre les propriétés et les méthodes.

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 Text propriété est liée à l’utilisation ci-dessus AsyncDS à l’aide PriorityBindingde :

<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 Binding objets, il commence par le premier Binding, qui est lié à la SlowestDP propriété. Binding Lorsqu’elle est traitée, elle ne retourne pas de valeur correctement, car elle est en veille pendant 5 secondes, de sorte que l’élément suivant Binding est traité. La suivante Binding ne retourne pas de valeur correctement, car elle est en veille pendant 3 secondes. Le moteur de liaison se déplace ensuite sur l’élément suivant Binding , qui est lié à la FastDP propriété. Cette opération Binding renvoie la valeur « Valeur rapide ». La TextBlock valeur « Valeur rapide » s’affiche maintenant.

Après 3 secondes écoulées, la SlowerDP propriété retourne la valeur « Valeur plus lente ». La TextBlock valeur « Valeur plus lente » s’affiche ensuite.

Après 5 secondes écoulées, la SlowestDP propriété retourne la valeur « Valeur la plus lente ». Cette liaison a la priorité la plus élevée, car elle est répertoriée en premier. La TextBlock valeur « Valeur la plus lente » s’affiche maintenant.

Pour PriorityBinding plus d’informations sur ce qui est considéré comme une valeur de retour réussie à partir d’une liaison.

Voir aussi