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
.NET Desktop feedback