Windows Presentation Foundation(WPF)中的 PriorityBinding 的工作原理是指定绑定列表。 绑定列表按优先级从最高优先级排序到最低优先级。 如果处理优先级最高的绑定时成功返回一个值,则永远不需要处理列表中的其他绑定。 如果最高优先级绑定需要很长时间才能评估出结果,而下一个次高优先级绑定成功返回值,那么将使用这个绑定,直到更高优先级的绑定成功返回值为止。
示例:
为了演示 PriorityBinding 的工作原理,已使用以下三个属性创建 AsyncDataSource
对象:FastDP
、SlowerDP
和 SlowestDP
。
FastDP
的 get 访问器返回 _fastDP
数据成员的值。
SlowerDP
的 get 访问器等待 3 秒,然后返回 _slowerDP
数据成员的值。
SlowestDP
的 get 访问器等待 5 秒,然后返回 _slowestDP
数据成员的值。
注释
此示例仅用于演示目的。 .NET 指南建议不要定义那些在速度上比字段集慢很多的属性。 有关详细信息,请参阅 如何选择属性或方法。
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
Text 属性使用 AsyncDS
绑定到上述 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>
当绑定引擎处理 Binding 对象时,它将从第一个 Binding 开始,该绑定绑定到 SlowestDP
属性。 处理此 Binding 时,它不会成功返回值,因为它正在休眠 5 秒,因此将处理下一个 Binding 元素。 下一个 Binding 不会成功返回值,因为它正处于持续 3 秒的休眠状态。 然后,绑定引擎移动到下一个 Binding 元素,该元素被绑定到 FastDP
属性。 此 Binding 返回值“快速值”。
TextBlock 现在显示值“快速值”。
3 秒后,SlowerDP
属性返回值“较慢值”。 之后 TextBlock 会显示值“较慢值”。
5 秒后,SlowestDP
属性返回值“最慢值”。 该绑定具有最高优先级,因为它首先列出。
TextBlock 现在显示值“最慢值”。
有关被视为从绑定成功返回值的信息,请参阅 PriorityBinding。