Porady: implementowanie PriorityBinding

PriorityBinding W programie Windows Presentation Foundation (WPF) działa określenie listy powiązań. Lista powiązań jest uporządkowana od najwyższego priorytetu do najniższego priorytetu. Jeśli powiązanie o najwyższym priorytcie zwraca wartość pomyślnie przetworzoną, nigdy nie trzeba przetwarzać innych powiązań na liście. Może się okazać, że obliczanie powiązania o najwyższym priorytcie zajmuje dużo czasu. Następny najwyższy priorytet, który zwraca wartość pomyślnie, zostanie użyty do momentu pomyślnego zwrócenie wartości o wyższym priorytetu.

Przykład

Aby zademonstrować, jak PriorityBinding działa, AsyncDataSource obiekt został utworzony przy użyciu następujących trzech właściwości: FastDP, SlowerDPi SlowestDP.

Metoda pobierania FastDP zwraca wartość _fastDP elementu członkowskiego danych.

Uzyskiwanie dostępu SlowerDP do oczekiwania przez 3 sekundy przed zwróceniem wartości _slowerDP elementu członkowskiego danych.

Uzyskiwanie dostępu SlowestDP do oczekiwania przez 5 sekund przed zwróceniem wartości _slowestDP elementu członkowskiego danych.

Uwaga

Ten przykład służy tylko do celów demonstracyjnych. Wytyczne dotyczące platformy .NET zalecają definiowanie właściwości o większej wielkości niż zestaw pól. Aby uzyskać więcej informacji, zobacz Wybieranie między właściwościami i metodami.

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

Właściwość Text wiąże się z powyższymi AsyncDS elementami przy użyciu polecenia 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>

Gdy aparat powiązań przetwarza Binding obiekty, rozpoczyna się od pierwszego Binding, który jest powiązany z właściwością SlowestDP . Po przetworzeniu nie Binding zwraca ona pomyślnie wartości, ponieważ jest spana przez 5 sekund, więc następny Binding element jest przetwarzany. Następna Binding wartość nie zwraca pomyślnie, ponieważ śpi przez 3 sekundy. Następnie aparat wiązania przechodzi do następnego Binding elementu, który jest powiązany z właściwością FastDP . Spowoduje to Binding zwrócenie wartości "Fast Value". Teraz TextBlock wyświetla wartość "Szybka wartość".

Po upływie 3 sekund SlowerDP właściwość zwraca wartość "Wolniejsza wartość". Następnie TextBlock wyświetla wartość "Wolniejsza wartość".

Po upływie 5 sekund SlowestDP właściwość zwraca wartość "Najwolniejsza wartość". To powiązanie ma najwyższy priorytet, ponieważ jest ono wymienione jako pierwsze. Teraz TextBlock wyświetla wartość "Najwolniejsza wartość".

Zobacz PriorityBinding , aby uzyskać informacje o tym, co jest uznawane za pomyślną wartość zwracaną z powiązania.

Zobacz też