Condividi tramite


Procedura: implementare un oggetto PriorityBinding

Il funzionamento di PriorityBinding in Windows Presentation Foundation (WPF) è basato sulla specifica di un elenco di associazioni. L'elenco di associazioni è ordinato dalla priorità più elevata a quella meno elevata. Se l'associazione con la priorità più elevata restituisce correttamente un valore durante la relativa elaborazione, non sarà necessario elaborare le altre associazioni in elenco. Nel caso in cui l'associazione con la priorità più elevata richieda tempi lunghi per la relativa valutazione, verrà utilizzata la priorità immediatamente successiva che restituisce correttamente un valore, finché un'associazione con priorità più elevata non restituisce a sua volta un valore corretto.

Esempio

Per mostrare il funzionamento di PriorityBinding, è stato creato l'oggetto AsyncDataSource con le seguenti tre proprietà: FastDP, SlowerDP e SlowestDP.

La funzione di accesso get di FastDP restituisce il valore del membro dati _fastDP.

La funzione di accesso get di SlowerDP rimane in attesa per 3 secondi prima di restituire il valore del membro dati _slowerDP.

La funzione di accesso get di SlowestDP rimane in attesa per 5 secondi prima di restituire il valore del membro dati _slowestDP.

NotaNota

Questo esempio viene riportato a scopo puramente dimostrativo.Nelle linee guida di Microsoft .NET si consiglia di non definire le proprietà che risultino notevolmente più lente rispetto a un insieme di campi.Per ulteriori informazioni, vedere Scelta tra proprietà e metodi.

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 proprietà Text viene associata all'oggetto AsyncDS indicato in precedenza tramite 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>

Quando il motore di associazione elabora gli oggetti Binding, inizia dal primo oggetto Binding associato alla proprietà SlowestDP. Durante l'elaborazione, tale oggetto Binding non restituisce correttamente alcun valore perché rimane inattivo per 5 secondi; viene quindi elaborato l'elemento Binding successivo. L'oggetto Binding successivo, a sua volta, non restituisce correttamente alcun valore, perché rimane inattivo per 3 secondi. Il motore di associazione passa quindi all'elemento Binding successivo, associato alla proprietà FastDP. Tale oggetto Binding restituisce il valore "Fast Value". Nell'oggetto TextBlock viene ora visualizzato il valore "Fast Value".

Trascorsi 3 secondi, la proprietà SlowerDP restituisce il valore "Slower Value". Nell'oggetto TextBlock viene quindi visualizzato il valore "Slower Value".

Trascorsi 5 secondi, la proprietà SlowestDP restituisce il valore "Slowest Value". Tale associazione ha la priorità più elevata perché viene visualizzata per prima nell'elenco. Nell'oggetto TextBlock viene ora visualizzato il valore "Slowest Value".

Per informazioni sulla definizione di valore restituito correttamente da un'associazione, vedere PriorityBinding.

Vedere anche

Riferimenti

Binding.IsAsync

Concetti

Cenni preliminari sull'associazione dati

Altre risorse

Procedure relative all'associazione dati