Практическое руководство. Реализация класса PriorityBinding
PriorityBinding в Windows Presentation Foundation (WPF) действует путем указания списка привязок. Список привязок упорядочен от наивысшего приоритета до самого низкого приоритета. Если привязка с наивысшим приоритетом успешно возвращает значение при обработке, то нет необходимости обрабатывать другие привязки в списке. Может случиться так, что для оценки привязки с наивысшим приоритетом потребуется много времени; тогда будет использоваться следующая по приоритету привязка в списке, успешно возвращающая значение, до тех пор, пока не выдаст значение привязка с более высоким приоритетом.
Пример
Чтобы продемонстрировать, как действует PriorityBinding, был создан объект AsyncDataSource
со следующими тремя свойствами: FastDP
, SlowerDP
и SlowestDP
.
Метод доступа get FastDP
возвращает значение элемента данных _fastDP
.
Метод доступа get SlowerDP
ожидает в течение 3 секунд, прежде чем выдать значение элемента данных _slowerDP
.
Метод доступа get SlowestDP
ожидает в течение 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.
См. также
.NET Desktop feedback
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по