如何:实现 PriorityBinding
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 属性使用 PriorityBinding 绑定到上述 AsyncDS
:
<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 秒的休眠状态。 然后绑定引擎会移动到下一个绑定到 FastDP
属性的 Binding 元素。 此 Binding 返回值“快速值”。 TextBlock 现在显示值“快速值”。
3 秒后,SlowerDP
属性返回值“较慢值”。 之后 TextBlock 会显示值“较慢值”。
5 秒后,SlowestDP
属性返回值“最慢值”。 该绑定具有最高优先级,因为它列在最前面。 TextBlock 现在显示值“最慢值”。
有关被视为从绑定成功返回值的信息,请参阅 PriorityBinding。