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