Como implementar PriorityBinding

PriorityBinding no Windows Presentation Foundation (WPF) funciona especificando uma lista de associações. A lista de associações é ordenada da prioridade mais alta para a prioridade mais baixa. Se a associação de maior prioridade retornar um valor com êxito quando ele é processado, nunca haverá a necessidade de processar as outras associações na lista. Pode ser o caso de a associação de maior prioridade levar muito tempo para ser avaliada, a próxima prioridade mais alta que retorna um valor com sucesso será usada até que uma associação de uma prioridade mais alta retorne um valor com êxito.

Exemplo

Para demonstrar como PriorityBinding funciona, o AsyncDataSource objeto foi criado com as três propriedades a seguir: FastDP, SlowerDPe SlowestDP.

O acessador get de FastDP retorna o valor do membro de dados _fastDP.

O acessador get da SlowerDP aguarda três segundos antes de retornar o valor do membro de dados _slowerDP.

O acessador get da SlowestDP aguarda cinco segundos antes de retornar o valor do membro de dados _slowestDP.

Observação

Este exemplo é para fins de demonstração. As diretrizes do .NET não recomendam a definição de propriedades que são ordens de magnitude mais lentas do que um conjunto de campos seria. Para obter mais informações, consulte Escolhendo entre propriedades e métodos.

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

A Text propriedade se vincula ao acima 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 o mecanismo de vinculação processa os Binding objetos, ele começa com o primeiro Binding, que é vinculado à SlowestDP propriedade. Quando isso Binding é processado, ele não retorna um valor com êxito porque ele está em suspensão por 5 segundos, portanto, o próximo Binding elemento é processado. O próximo Binding não retorna um valor com êxito porque ele está em suspensão por 3 segundos. Em seguida, o mecanismo de vinculação passa para o próximo Binding elemento, que está vinculado à FastDP propriedade. Isso Binding retorna o valor "Fast Value". O TextBlock agora exibe o valor "Fast Value".

Depois de 3 segundos, a propriedade SlowerDP retorna o valor “Valor mais Lento”. O TextBlock então exibe o valor "Valor mais lento".

Depois de 5 segundos, a propriedade SlowestDP retorna o valor “Valor mais Lento”. Essa associação tem a maior prioridade porque é listada primeiro. O TextBlock agora exibe o valor "Valor mais lento".

Consulte PriorityBinding para obter informações sobre o que é considerado um valor de retorno bem-sucedido de uma associação.

Confira também