Cómo: Implementar PriorityBinding

PriorityBinding en Windows Presentation Foundation (WPF) funciona especificando una lista de enlaces. La lista de enlaces se ordena por orden de prioridad descendente. Si el enlace de máxima prioridad devuelve correctamente un valor cuando se procesa, entonces nunca es necesario procesar los demás enlaces de la lista. Puede suceder que el enlace de máxima prioridad tarde mucho tiempo en evaluarse; si esto ocurre, se utilizará el enlace con el siguiente nivel de prioridad que devuelva correctamente un valor hasta que un enlace con una prioridad superior devuelva correctamente un valor.

Ejemplo

Para mostrar 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 durante 3 segundos antes de devolver el valor del miembro de datos _slowerDP.

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

NotaNota

El único fin de este ejemplo es usarlo para realizar una demostración.Las instrucciones de Microsoft .NET no recomiendan la definición de propiedades con órdenes de magnitud más lentos que los de un conjunto de campos.Para obtener más información, consulte Elegir entre propiedades y métodos.

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 propiedad Text se enlaza al AsyncDS anterior utilizando 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 por el primer objeto Binding, que está enlazado a la propiedad SlowestDP. Cuando se procesa este objeto Binding, no devuelve correctamente un valor porque está inactivo durante 5 segundos, por lo que se procesa el elemento Binding siguiente. El Binding siguiente no devuelve correctamente un valor porque está inactivo durante 3 segundos. Entonces, el motor de enlace pasa al elemento Binding siguiente, que está enlazado a la propiedad FastDP. Este objeto Binding devuelve el valor "Fast Value". Ahora, TextBlock muestra el valor "Fast Value".

Una vez transcurridos 3 segundos, la propiedad SlowerDP devuelve el valor "Slower Value". Entonces, TextBlock muestra el valor "Slower Value".

Una vez transcurridos 5 segundos, la propiedad SlowestDP devuelve el valor "Slowest Value". Este enlace es el de máxima prioridad, porque figura en primer lugar en la lista. Ahora, TextBlock muestra el valor "Slowest Value".

Consulte PriorityBinding para obtener información sobre qué se considera un valor devuelto correctamente de un enlace.

Vea también

Referencia

Binding.IsAsync

Conceptos

Información general sobre el enlace de datos

Otros recursos

Temas "Cómo..." sobre enlace de datos