Практическое руководство. Реализация класса 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 для получения сведений об условиях успешного возвращаемого значения привязки.

См. также

Ссылки

Binding.IsAsync

Основные понятия

Общие сведения о связывании данных

Другие ресурсы

Практические руководства по привязке данных