Практическое руководство. Реализация класса PriorityBinding
Класс PriorityBinding в Windows Presentation Foundation (WPF) работает путем указания списка привязок. Список привязок упорядочен от наивысшего приоритета к более низкому приоритету. Если при обработке привязка наивысшего приоритета успешно возвращает значение, то нет необходимости обрабатывать другие привязки в списке. Это может происходить в том случае, когда выполнение привязки наивысшего приоритета занимает много времени, а следующий высокий приоритет, успешно возвращающий значение, будет использоваться до тех пор, пока привязка более высокого приоритета не вернет значение.
Пример
Для демонстрации работы класса PriorityBinding был создан объект AsyncDataSource со следующими тремя свойствами: FastDP, SlowerDP и SlowestDP.
Метод доступа Get свойства FastDP возвращает значение члена данных _fastDP.
Метод доступа Get свойства SlowerDP ожидает 3 секунды перед возвратом значения члена данных _slowerDP.
Метод доступа Get свойства SlowestDP ожидает 5 секунд перед возвратом значения члена данных _slowestDP.
Примечание |
---|
Этот пример используется только в качестве демонстрации.Правила Microsoft .NET рекомендованы для определения свойств, которые на несколько порядков медленнее, чем мог бы быть набор полей.Дополнительные сведения см. в разделе Выбор между свойствами и методами. |
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; }
}
}
Свойство 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 возвращает значение "Fast Value". Теперь элемент TextBlock отображает значение "Fast Value".
По прошествии 3 секунд свойство SlowerDP возвращает значение "Slower Value". Затем элемент TextBlock отображает значение "Slower Value".
По прошествии 5 секунд свойство SlowestDP возвращает значение "Slowest Value". Эта привязка имеет наивысший приоритет, поскольку она указана первой. Теперь элемент TextBlock отображает значение "Slowest Value".
См. описание класса PriorityBinding для получения сведений об условиях успешного возвращаемого значения привязки.
См. также
Ссылки
Основные понятия
Общие сведения о связывании данных