Практическое руководство. Реализация класса 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.

См. также