Share via


Cómo: Implementar PriorityBinding

PriorityBinding funciona en Windows Presentation Foundation (WPF) especificando una lista de enlaces. La lista de enlaces se ordena de la prioridad más alta a la más baja. Si el enlace de prioridad más alta devuelve correctamente un valor cuando se procesa, no es necesario procesar los demás enlaces de la lista. Si se diera el caso de que el enlace de prioridad más alta tarda mucho en evaluarse, la siguiente prioridad más alta que devuelve un valor correctamente se usará hasta que un enlace de una prioridad más alta devuelva correctamente un valor.

Ejemplo

Para demostrar cómo funciona PriorityBinding, se ha creado el objeto AsyncDataSource con las tres propiedades siguientes: FastDP, SlowerDP y SlowestDP.

El descriptor de acceso get de FastDP devuelve el valor del miembro de datos _fastDP.

El descriptor de acceso get de SlowerDP espera 3 segundos antes de devolver el valor del miembro de datos _slowerDP.

El descriptor de acceso get de SlowestDP espera 5 segundos antes de devolver el valor del miembro de datos _slowestDP.

Nota:

Este ejemplo tiene como único fin realizar una demostración. Las directrices de .NET no recomiendan definir propiedades que sean órdenes de magnitud más lenta que un conjunto de campos. Para más información, vea Elegir entre propiedades y 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

La propiedad Text se enlaza a AsyncDS anterior mediante 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>

Cuando el motor de enlace procesa los objetos Binding, comienza con la primera clase Binding, que está enlazada a la propiedad SlowestDP. Cuando esta clase Bindingse procesa, no devuelve correctamente un valor porque está en suspensión durante 5 segundos, por lo que se procesa el elemento Binding siguiente. La clase Binding siguiente no devuelve correctamente un valor porque está en suspensión durante 3 segundos. Después, el motor de enlace se mueve al siguiente elemento Binding, que está enlazado a la propiedad FastDP. Esta clase Binding devuelve el valor "Fast Value". Ahora TextBlock muestra el valor "Fast Value".

Después de 3 segundos, la propiedad SlowerDP devuelve el valor "Slower Value". A continuación, TextBlock muestra el valor "Slower Value".

Después de 5 segundos, la propiedad SlowestDP devuelve el valor "Slowest Value". Ese enlace tiene la prioridad más alta porque aparece primero. Ahora, TextBlock muestra el valor "Slowest Value".

Consulte PriorityBinding para información sobre lo que se considera un valor devuelto correctamente de un enlace.

Vea también