Procedura: implementare un oggetto PriorityBinding

PriorityBinding in Windows Presentation Foundation (WPF) funziona specificando un elenco di associazioni. L'elenco delle associazioni viene ordinato dalla priorità più alta alla priorità più bassa. Se l'associazione con priorità più alta restituisce correttamente un valore quando viene elaborato, non è mai necessario elaborare le altre associazioni nell'elenco. Potrebbe trattarsi del caso in cui l'associazione con priorità più alta richiede molto tempo per essere valutata, la successiva priorità più alta che restituisce correttamente un valore verrà usata fino a quando un'associazione con priorità più alta restituisce correttamente un valore.

Esempio

Per illustrare il funzionamentoPriorityBinding, l'oggetto AsyncDataSource è stato creato con le tre proprietà seguenti: FastDP, e .SlowestDPSlowerDP

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

La funzione di accesso get di SlowerDP attende 3 secondi prima di restituire il valore del _slowerDP membro dati.

La funzione di accesso get di SlowestDP attende 5 secondi prima di restituire il valore del _slowestDP membro dati.

Nota

Questo esempio viene fornito solo per scopi dimostrativi. Le linee guida .NET consigliano di definire le proprietà che sono ordini di grandezza più lente rispetto a un set di campi. Per altre informazioni, vedere Scelta tra proprietà e metodi.

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 proprietà viene associata all'oggetto precedente AsyncDS usando 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 Binding oggetti, inizia con il primo Binding, associato alla SlowestDP proprietà . Quando viene Binding elaborato, non restituisce correttamente un valore perché è in sospensione per 5 secondi, quindi viene elaborato l'elemento successivo Binding . Il successivo Binding non restituisce un valore correttamente perché è in sospensione per 3 secondi. Il motore di associazione passa quindi all'elemento successivo Binding , associato alla FastDP proprietà . Verrà Binding restituito il valore "Fast Value". Ora TextBlock viene visualizzato il valore "Fast Value".

Dopo 3 secondi, la SlowerDP proprietà restituisce il valore "Valore più lento". Viene TextBlock quindi visualizzato il valore "Valore più lento".

Dopo 5 secondi, la SlowestDP proprietà restituisce il valore "Valore più lento". Tale associazione ha la priorità più alta perché è elencata per prima. Viene TextBlock ora visualizzato il valore "Valore più lento".

Vedere PriorityBinding per informazioni su ciò che viene considerato un valore restituito con esito positivo da un'associazione.

Vedi anche